给定代码的输出是
ClassB的
ClassA的
class Main{
public static void main(String args){
new Main().getVal(null); //which method will be called????
A obj=new B();
new Main().getVal(obj); //which method will be called????
}
public void getVal(A o){
System.out.println("class A");
}
public void getVal(B o){
System.out.println("class B");
}
}
class A{
}
class B extends A{
}
因此很明显,当传递null时,将调用具有最多子项作为参数的方法,在第二种情况下,调用将在引用类型上进行保护,而不是在创建的对象上进行。 Sp可以任何人给我解释为什么会发生这种情况或者内部发生了什么?
答案 0 :(得分:7)
Java将尝试找到最具体的方法。
Null可以是任何类型,因此最具体的方法是类型B
,因此打印的第一行是#34; B"。
对于第二行,您有一个A
类型的变量,静态绑定用于确定要调用的方法,因此第二行打印" A类和#34;。对于参数类型,不使用多态和动态绑定;它取决于传入的变量的静态类型。
Section 15.12.2.5 of the JLS州:
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时错误的调用,那么一个方法比另一个方法更具体。