«Переопределение» частных методов с вызовом upcasting в 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 (), он вызывает функцию f (), принадлежащую PrivateOverride, потому что метод f () класса PrivateOverride не может быть переопределен? Но d () наследуется от PrivateOverride должен принадлежать DerivedWithOutD, почему d () вызывает private f ()? И почему класс DerivedWithD, кажется, делает переопределение, и может вызвать public f ()? Кроме того, когда я изменяю f () PrivateOverride на public, все это выводит Derived f (), это смущает меня сейчас!

Ответы на вопрос(1)

Ваш ответ на вопрос