我有这些类(class):
class A {
public void f() { System.out.println("f() in A"); }
public void g() { System.out.println("g() in A"); f(); }
}
class B extends A {
public void f() { System.out.println("f() in B"); }
}
为什么
B b = new B();
A a = b;
a.g();
打印出来
g() in A
f() in B
不是
g() in A
f() in A
有什么我想念的吗?
最佳答案
这是因为 Java 使用了 dynamic dispatch默认(和强制)在类的方法上。
此功能可确保在调用方法时,选择执行该方法的最专用版本。在您的情况下,由于 B extends A
,这意味着 B
的 public void f()
实现比 >一个
。因此,虽然 A a
是静态类型 A
,但它是动态类型 B
并且选择了该方法。
关于Java父类(super class)调用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34181393/