Java 重载和覆盖函数调用
Java Overloaded & Overridden Function call
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,因此我们沿着层次结构向下进入 class B。此外,参数的静态类型,即。 b,是 B,因此它的输出应该是:
B b.meth() called
显然我错了。我想弄清楚这一点。有人可以帮我理解我哪里错了吗?如果我的算法有误,请告诉我。提前致谢。
Class A
没有 meth(B a)
,因此当您将此方法添加到 class B
时,它不会覆盖任何内容(不是甚至 meth(A a)
来自 class A
)。
当你编译 a.meth(b)
编译器选择最适合 B 参数类型的方法。由于选择了 B extends A
meth(A a)
。
当您执行 a.meth(b)
多态性(通过动态绑定)从a
持有的实际对象类型调用meth(A a)
时,它在你的情况是B
。所以你看到 B a.meth() called
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,因此我们沿着层次结构向下进入 class B。此外,参数的静态类型,即。 b,是 B,因此它的输出应该是:
B b.meth() called
显然我错了。我想弄清楚这一点。有人可以帮我理解我哪里错了吗?如果我的算法有误,请告诉我。提前致谢。
Class A
没有 meth(B a)
,因此当您将此方法添加到 class B
时,它不会覆盖任何内容(不是甚至 meth(A a)
来自 class A
)。
当你编译 a.meth(b)
编译器选择最适合 B 参数类型的方法。由于选择了 B extends A
meth(A a)
。
当您执行 a.meth(b)
多态性(通过动态绑定)从a
持有的实际对象类型调用meth(A a)
时,它在你的情况是B
。所以你看到 B a.meth() called