使用java中的upcasting调用“覆盖”私有方法

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()inheritance自PrivateOverride应该属于DerivedWithOutD,为什么d()调用私有f()? 为什么DerivedWithD类似乎做覆盖,并且可以调用public f()? 另外,当我将PrivateOverride的f()更改为public时,它全部打印Derived f(),现在让我感到困惑!

子类不能覆盖私有方法。 如果子类声明一个方法与父类中的私有方法具有相同的签名,则子类方法不会覆盖超类方法。

当你调用方法d() ,如果子类没有覆盖d() ,则执行的方法是PrivateOverrided() 。 当该方法调用f() ,它会看到PrivateOverride定义的私有f()方法。 由于该方法未被覆盖(因为它不能),它调用该方法而不是子类的f()方法。

如果重写d() ,则执行子类DerivedWithDd()方法。 当该方法调用f() ,它调用DerivedWithDf()方法。

如果f()不再是私有的,则子类中的f()方法现在会覆盖超类的f()方法,因此在两种情况下都会执行子类的f()