我有以下代码:

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)。由于多态性或动态绑定,将调用Cprint(B)

关于java - 静态和动态绑定(bind)的歧义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20342162/

10-08 21:58