Почему мы не можем переопределить частные члены суперкласса в подклассе? - PullRequest
0 голосов
/ 09 июля 2020

Разве подкласс независимо не наследует все члены суперкласса, так почему бы не иметь возможность переопределить частные переменные-члены суперкласса? Было бы небезопасно предположить, что подкласс имеет свою собственную частную версию члена и может переопределить ее в Java?

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Подклассы не наследуют закрытые члены в java. Подкласс ничего не знает о родительском классе

0 голосов
/ 09 июля 2020

Вы получили некоторые подсказки из другой информации, но вот пример. Представьте себе два класса: Foo и Bar. Bar наследуется от Foo. Вот простая реализация каждого из них:

public class Foo {
    private void myPrivateMethod() { System.out.printf("myPrivateMethod()\n"); }
    public void myPublicMethod() { System.out.printf("myPublicMethod()\n"); }
}

public class Bar extends Foo {
    public void barPublicMethod() {
        System.out.printf("This is barPublicMethod()!\n");

        myPublicMethod();
        myPrivateMethod();
    }

    public static void main(String[] args) {
        System.out.printf("This is main!\n");

        Bar bar = new Bar();
        bar.barPublicMethod();
    }
}

Если вы попытаетесь скомпилировать этот код, вы получите следующую ошибку:

$ javac Foo.java Bar.java && java Bar
Bar.java:6: error: cannot find symbol
        myPrivateMethod();
        ^
  symbol:   method myPrivateMethod()
  location: class Bar
1 error

Если вы удалите вызов myPrivateMethod (), он работает . Такова природа частных методов.

Bar НИЧЕГО не знает о частных методах Foo. НИЧЕГО. Это означает, что вы не можете их переопределить, потому что Бар даже не знает, что они существуют. Вот что значит приватный.

Bar не может делать ничего с приватными методами из Foo. Ничего. Если вы хотите, чтобы Bar мог их переопределить, вам нужно изменить определение в Foo на protected или publi c.

0 голосов
/ 09 июля 2020

Было бы небезопасно предположить, что подкласс имеет свою собственную частную версию члена и может переопределить в Java?

NO

Просто подумайте о написании библиотеки, а не просто кода только для вашего текущего проекта.

Ваши классы могут быть унаследованы, чтобы добавить больше функций, но пользователь вашей библиотеки не должен изменять ваше поведение.

Простым примером может быть класс AtomicInteger Java, у него есть поле private volatile int value;. Теперь, если бы вы могли получить доступ к этому члену, просто наследующему класс, это означало бы, что вы могли бы изменить значение, потеряв все AtomicInteger потокобезопасность.

Я уверен, что если вы посмотрите в java.util пакет, вы найдет много похожих случаев, в которых какое-то поле есть, а должно быть управляемым внутри и доступным только из методов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...