代码之家  ›  专栏  ›  技术社区  ›  KeyC0de

Java重载和重写函数调用

  •  -3
  • KeyC0de  · 技术社区  · 8 年前
    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);
    

    B b.meth() called
    

    显然我错了。我在想办法。有人能帮我理解我错在哪里吗?如果我的算法错误,请告诉我。提前谢谢。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Pshemo    8 年前

    A 不必 meth(B a) ,所以当您将此方法添加到类 B meth(A a) 来自课堂 A. ).

    当你 编写 a.meth(b) B extends A 甲基苯丙胺 被选中。

    当你 a、 甲基(乙) 多形性(通过动态绑定)调用 甲基苯丙胺 从对象的实际类型 a B 你看 B a.meth() called