静态和动态绑定歧义

时间:2013-12-03 03:11:04

标签: java binding

我有以下代码:

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类中的方法。现在为什么选择第二种方法呢?为什么不选择第一个?

2 个答案:

答案 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.