在 java 中使用向上转换调用“覆盖”私有方法

“overriding” private methods with upcasting call in java

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()方法时,调用了属于PrivateOverride的f(),是因为PrivateOverride的f()方法无法重写吗?但是d() 继承自PrivateOverride 应该属于DerivedWithOutD,为什么d() 调用private f()?为什么 DerivedWithD class 似乎会覆盖,并且可以调用 public f()?另外,当我将 PrivateOverride 的 f() 更改为 public 时,它全部打印 Derived f(),这让我很困惑!

私有方法不能被子class重写。如果 sub-classes 声明的方法与父 class 中的私有方法具有相同的签名,则 sub-class 方法不会覆盖 super-class 方法。

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

f() 方法

如果d()被覆盖,则执行子classDerivedWithDd()方法。当该方法调用 f() 时,它会调用 DerivedWithDf() 方法。

如果 f() 不再是私有的,子 classes 中的 f() 方法现在会覆盖 super-class 的 f() 方法],因此在这两种情况下都会执行子 class 的 f()