我有以下代码:
class A{
public void print(A a){
System.out.println("A 1");
}
}
class B extends A{
public void print(A a){
System.out.println("B 1");
}
public void print(B b){
System.out.println("B 2");
}
}
class C extends B{
public void print(A a){
System.out.println("C 1");
}
public void print(B b){
System.out.println("C 2");
}
public void print(C c){
System.out.println("C 3");
}
}
class D extends C{
public void print(A a){
System.out.println("D 1");
}
public void print(B b){
System.out.println("D 2");
}
public void print(C c){
System.out.println("D 3");
}
public void print(D d){
System.out.println("D 4");
}
}
public class Test{
public static void main(String args[]){
B inst = new C();
inst.print(new D());
}
}
输出是C 2,但我不明白为什么。好吧,我明白了,由于动态绑定,将调用C类中的方法。现在为什么选择第二种方法呢?为什么不选择第一个?
答案 0 :(得分:1)
由于inst
被声明为B
类型,因此唯一可见的方法是B
可见的方法
class B extends A{
// @Override
public void print(A a){
System.out.println("B 1");
}
public void print(B b){
System.out.println("B 2");
}
}
使用方法重载时,the method with the most specific possible arguments is chosen.在这种情况下,即print(B)
。由于多态或动态绑定,将调用C
的{{1}}。
答案 1 :(得分:0)
它选择第二个函数,因为它最接近你提供给的对象。
它不能选择选项C 3,因为在参考实例中没有C 3的方法。
如果你在inst.print中传递A的对象,它将显示C 1,如果休息它将显示C 2.