我有以下代码:
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类中的方法。现在为什么选择第二种方法?为什么不选择第一个?
最佳答案
由于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
的print(B)
。关于java - 静态和动态绑定(bind)的歧义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20342162/