«Переопределение» частных методов с вызовом 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)

Решение Вопроса

объявляют метод с той же сигнатурой, что и у частного метода в родительском классе, метод подкласса не переопределяет метод суперкласса.

Когда вы вызываете методd(), еслиd() не переопределяется подклассом, выполняемый методPrivateOverride«sd(), Когда этот метод вызываетf()Видит частноеf() метод, определенный вPrivateOverride, Поскольку этот метод не переопределяется (как это не может быть), он вызывает этот метод, а неf() метод подкласса.

Еслиd() переопределяется,d() метод подклассаDerivedWithD выполнен. Когда этот метод вызываетf()называетf() методDerivedWithD.

Еслиf() больше не является частным,f() Метод в подклассах теперь переопределяетf() метод суперкласса, а следовательноf() подкласса выполняется в обоих случаях.

 Eran14 июн. 2016 г., 14:32
@ Джек Еслиf() является общедоступным, переопределение подклассовf(), Поэтому, даже если вы называете базовый классd(), это вызывает версию подклассаf(), Вот как работает полиморфизм.
 Jaycee14 июн. 2016 г., 14:28
как вы сказали, если d () не переопределено подклассом, выполняемый метод является d () PrivateOverride, то почему, когда f () общедоступен, метод d () вызывает DerivedWithD для f ()? исполняемый метод не является PrivateOverride D (), когда F () является публичным?
 Jaycee14 июн. 2016 г., 14:42
Спасибо Эран, теперь я понимаю, ты имеешь в виду, что все методы будут принадлежать базовому классу, если подкласс не переопределит его? Даже я использую DerivedWithOutD d = new DerivedWithOutD (); d вызывает метод, всегда принадлежащий базовому классу, если он не переопределяет его
 Jaycee14 июн. 2016 г., 15:01
Я думал, что метод, унаследованный от базового класса, будет принадлежать подклассу, даже если он не переопределяет метод, однако, несмотря на это выше, унаследованный метод все еще принадлежит базовому классу, поэтому DerivedWithOutD d = new DerivedWithOutD (); d.d () все еще печатает PrivateOverride f (), верно?
 Eran14 июн. 2016 г., 14:48
@Jack Если вы вызываете метод базового класса, а подкласс не переопределяет его, метод базового класса будет выполнен. Не уверен, что вы подразумеваете под "весь метод будет принадлежать базовому классу".

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