假设我在 Java 中有以下类:
class B {
public void foo(B obj) {
System.out.print("B1 ");
}
public void foo(C obj) {
System.out.print("B2 ");
}
}
public class C extends B {
public void foo(B obj) {
System.out.print("C1 ");
}
public void foo(C obj) {
System.out.print("C2 ");
}
public static void main(String[] args) {
B c = new C();
B b = new B();
b.foo(c);
c.foo(b);
c.foo(c);
}
}
为什么我得到以下结果:
B1
C1
C1
我不明白这部分究竟发生了什么:
c.foo(b); // 打印 C1
c.foo(c); // 打印 C1
Java 虚拟机 (JVM) 为每个变量中引用的对象调用适当的方法。它不会调用由变量类型定义的方法。这就是运行时多态性。
B c = new C();
c.foo(b);
c.foo(c);
在上面的例子中,虽然变量类型是 B 但它所指的对象是对象类型 C。因此 C 类方法被调用。
现在为什么它打印 C1 因为 Java Lang 规范如下:
调用方法时(第 15.12 节),在编译时使用实际参数(和任何显式类型参数)的数量和参数的编译时类型来确定将被调用的方法的签名(第 15.12.2 节)。如果要调用的方法是实例方法,则将在运行时使用动态方法查找(第 15.12.4 节)确定要调用的实际方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句