Java Overloaded&重写函数调用

时间:2016-11-01 14:39:46

标签: java inheritance override overloading dynamic-dispatch

class A {
    void meth(A a) { System.out.println("A a.meth() called"); }
    void meth(D d) { System.out.println("A d.meth() called"); }
    void meth(E e) { System.out.println("A e.meth() called"); }
}

class D {}

class E extends D {}

class B extends A {
    void meth(A a) { System.out.println("B a.meth() called"); }
    void meth(B b) { System.out.println("B b.meth() called"); }
    void meth(D d) { System.out.println("B d.meth() called"); }
    void meth(E e) { System.out.println("B e.meth() called"); }
}


public class OverldOverd {
    public static void main (String[] args) {
        B b = new B();
        A a = b;

        a.meth(a);    // B a.meth() called
        a.meth(b);    // B a.meth() called /*! Why? !*/
    }
}

我正试图理解这一行:

a.meth(b);

这是我的算法:a有静态类型A和动态类型B,所以我们沿着层次结构进入类B.此外,参数的静态类型,即。 b,是B,因此它的输出应该是:

B b.meth() called

显然我错了。我想弄清楚这一点。有人可以帮我理解我错在哪里吗?如果我的算法错了,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:3)

A没有meth(B a),因此当您将此方法添加到类B时,它不会覆盖任何内容(甚至不会覆盖meth(A a)A 1}})。

当您编译 a.meth(b)编译器选择方法时,最适合B参数类型。由于挑选了B extends A meth(A a)

执行 a.meth(b)多态(通过动态绑定)从meth(A a)拥有的实际对象类型调用a,在您的情况下是{{ 1}}。所以你看到B