我的代码:
public class PrivateOverride {
private void f() {
System.out.println("private f()");
}
public static void main(String[] args) {
PrivateOverride po = new derived();
po.f();
}
}
class derived extends PrivateOverride {
public void f() {
System.out.println("public f()");
}
}
输出:
private f()
为什么?
答案 0 :(得分:7)
由于derived#f()
未覆盖父级的私有f()
方法。
您可以通过向f()
类中的derived
方法添加@Override注释来确认它,并确保它不会编译。
额外提示:
要覆盖方法f()
,它应该是来自父类的继承,即子类中的 visible ,从来都不是这样的私有方法。
this table总结了正确方法覆盖的其他规则。
答案 1 :(得分:2)
derived
无法看到PrivateOverride
的{{1}},因为它是私有的,因此这不是重写,而是新方法的定义。始终建议在重写方法上添加注释f()
,以避免此类隐藏问题。
答案 2 :(得分:2)
f
中的方法PrivateOverride
被声明为private
。这意味着它不会在derived
类中被覆盖。
这就是你应该使用@Override
注释的原因。在这种情况下,它会显示错误。
答案 3 :(得分:0)
因为私有方法不能在子类中继承,所以无法覆盖它。