【问题标题】:Java Overloaded & Overridden Function callJava重载和覆盖函数调用
【发布时间】:2016-11-01 14:39:45
【问题描述】:
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

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

【问题讨论】:

    标签: java inheritance overriding overloading dynamic-dispatch


    【解决方案1】:

    A 类没有meth(B a),因此当您将此方法添加到B 类时,它不会覆盖任何东西(甚至不会覆盖A 类中的meth(A a))。

    当您编译 a.meth(b) 编译器选择最适合B 参数类型的方法。因为B extends A meth(A a) 被选中。

    当您执行 a.meth(b) polymoprhism(通过动态绑定)从a 持有的实际对象类型调用meth(A a),在您的情况下为B。所以你看到B a.meth() called

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 2022-01-10
      • 2012-08-08
      • 2021-04-17
      • 2010-10-25
      • 2012-05-21
      • 2016-02-08
      相关资源
      最近更新 更多