继承和多态的奇怪行为 [Java]

哈立德

假设我在 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

Code_Eat_Sleep

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章