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()不能被高估吗?但是从PrivateOverride继承的d()应该属于DerivedWithOutD,为什么d()调用私有的f()?为什么DerivedWithD类似乎要进行覆盖,并且可以调用public f()?另外,当我将PrivateOverride的f()改为public时,所有的输出都是从f()派生出来的,这让我现在很困惑!
发布于 2016-06-14 10:21:27
私有方法不能被子类覆盖。如果子类声明的方法与父类中的私有方法具有相同的签名,则子类方法不会覆盖超类方法。
当您调用方法d()时,如果d()未被子类覆盖,则执行的方法是PrivateOverride的d()。当该方法调用f()时,它会看到在PrivateOverride中定义的私有f()方法。因为该方法没有被重写(因为它不能),所以它调用该方法,而不是调用子类的f()方法。
如果重写d(),则执行子类DerivedWithD的d()方法。当该方法调用f()时,它调用DerivedWithD的f()方法。
如果f()不再是私有的,子类中的f()方法将覆盖超类的f()方法,因此在这两种情况下都会执行子类的f()。
https://stackoverflow.com/questions/37809153
复制相似问题