我真的不明白为什么下面的代码不起作用。我希望B.f被打印出来。public class Main { public static void main(String[] args) { B b = new B(); b.g(); }}class A { void g() { f(); /* or this.f() */ }}class B extends A { void f() { System.out.println("B.f"); }}编译器抱怨:Main.java:13: error: cannot find symbol f(); /* or this.f() */ ^ symbol: method f() location: class A1 error根据我的理解,thisin的动态类型A.g始终是B. 其结果是,Java的动态方法查找应该能够找到B.f的this.f,然后执行它。
2 回答
幕布斯7119047
TA贡献1794条经验 获得超8个赞
Java 的动态调度只能看到定义在当前类或其超类上的方法。因为 A 没有定义方法,所以它看不到 B 定义了它,你会得到一个错误。
但是,如果该方法是私有以外的任何访问,B 可以覆盖它,因此即使在通过“A”实例类型访问该方法时,对 B 实例的方法调用也将被动态分派到 B 的实现。
大话西游666
TA贡献1817条经验 获得超14个赞
这将不起作用,因为 A 类对方法 f() 一无所知。如果您不想f()在 A 中定义,则可以使用f()abstract 代替,您可以使 classA也为 abstract :
abstract class A {
void g() {
f(); /* or this.f() */
}
abstract void f();
}
class B extends A {
void f() {
System.out.println("B.f");
}
}
添加回答
举报
0/150
提交
取消