面试遇到的:代码如下:
public class Test {
public static void main(String[] args){
new Test().new A().get(null);
}
class A{
public void get(Object o){
System.out.println("objct:" + o);
}
public void get(Integer str){
System.out.println("Integer:" + str);
}
}
}
问运行结果是什么?
答案:
Integer:null
延伸:假如把
传参改成Double类型,则结果又是什么?
public void get(Object o){
System.out.println("objct:" + o);
}
分析:
该题目涉及点较多,比如内部类的实例化,不作为重点;类A中有两个方法名一样的方法声明,复习一下,假如同一类中有两个或以上方法名一样的方法声明是如何区分的呢?(第一种:返回类型不一致;第二种:传入参数不一致,本题为第二种)。
当null作为参数传入时编译器选择哪一个方法调用呢?首先null表示不确定的对象,即不知道类型和值是什么,一切未知。所以:
当把传参类型改成Double,则main中无法确定到底调用哪一个方法(因为null表示不确定对象,so不知道它是Integer or Double喽),编译不通过;
当两个方法中传入的参数为继承关系时(Interger extends Object)则将不确定对象null当作子类型处理。到这里才是重点。