public class PrivateOverride {
private void f() {
System.out.println("PrivateOverride f()");
}
public static void main(String[] args) {
PrivateOverride po = new DerivedWithOutD();
po.d();// PrivateOverride f()
PrivateOverride poD = new DerivedWithD();
poD.d();//Derived f()
}
public void d() {
f();
}
}
class DerivedWithOutD extends PrivateOverride {
public void f() {
System.out.println("Derived f()");
}
}
class DerivedWithD extends PrivateOverride {
public void f() {
System.out.println("Derived f()");
}
public void d() {
f();
}
}
如上面的代码所示,当DerivedWithOutD没有覆盖方法d()时,它调用f()属于PrivateOverride,那是因为PrivateOverride的方法f()不能被覆盖吗?但是d( )继承自PrivateOverride应该属于DerivedWithOutD,为什么d()调用私有f()?为什么DerivedWithD类似乎做覆盖,并且可以调用public f()?另外,当我将PrivateOverride的f()更改为public时,它全部打印Derived f(),现在让我感到困惑!
答案 0 :(得分:1)
私有方法无法被子类覆盖。如果子类声明一个方法与父类中的私有方法具有相同的签名,则子类方法不会覆盖超类方法。
当您调用方法d()
时,如果子类未覆盖d()
,则执行的方法为PrivateOverride
' s d()
。当该方法调用f()
时,它会看到f()
中定义的私有PrivateOverride
方法。由于该方法未被覆盖(因为它不可能),因此它调用该方法而不是子类的f()
方法。
如果重写d()
,则会执行子类d()
的{{1}}方法。当该方法调用DerivedWithD
时,它会调用f()
的{{1}}方法。
如果f()
不再是私有的,则子类中的DerivedWithD
方法现在会覆盖超类的f()
方法,因此会覆盖f()
在这两种情况下都会执行子类。