Частные члены в наследовании Java - PullRequest
7 голосов
/ 01 июля 2011

Мне сказали, что для подкласса Java он может наследовать всех членов своего суперкласса.Так значит ли это даже частных членов?Я знаю, что он может наследовать защищенных членов.

Может кто-нибудь объяснить мне это.Я сейчас совершенно сбит с толку.

Ответы [ 5 ]

19 голосов
/ 01 июля 2011

Этот тип зависит от вашего точного использования слова наследования.Я объясню на примере.

Предположим, у вас есть два класса: Parent и Child, где Child расширяется Parent.Кроме того, Parent имеет личное целое число с именем value.

Теперь возникает вопрос: наследует ли Child частное value?В Java наследование определяется таким образом, что ответом будет «Нет».Тем не менее, в общем ООП-жаргоне, есть небольшая неоднозначность.

Вы могли бы сказать, что это не унаследовано, потому что нигде Child не может явно обратиться к value.Т.е. любой код, такой как this.value, не может использоваться в Child, и obj.value не может использоваться из некоторого вызывающего кода (очевидно).

Однако, в другом смысле, вы можете сказать, что value наследуется .Если вы считаете, что каждый экземпляр Child также является экземпляром Parent, то этот объект должен содержать value, как определено в Parent.Даже если класс Child ничего не знает об этом, закрытый член с именем value все еще существует в каждом экземпляре Child.Таким образом, в этом смысле вы можете сказать, что value наследуется в Child.

Поэтому, не используя слово «наследование», просто помните, что дочерние классы не знают о закрытых членах, определенных в родительских классах.,Но также помните, что эти закрытые члены все еще существуют в экземплярах дочернего класса.

18 голосов
/ 01 июля 2011

Нет, закрытый член не наследуется , поскольку область действия частного члена ограничена только классом, в котором он определен. Только публичный и защищенный член наследуется.

Из Java Documentation,

Частные члены в суперклассе

Подкласс не наследует частные члены своего родительского класса. Однако, если суперкласс имеет публичный или защищенные методы для доступа к его частные поля, они также могут быть использованы по подклассу. Вложенный класс имеет доступ ко всем частным членам его включающий класс - как поля, так и методы. Поэтому общественность или защищенный вложенный класс, унаследованный подкласс имеет косвенный доступ ко всем частные члены суперкласса.

Из JLS,

Члены класса , которые объявлены частные не наследуются подклассы этого класса. Только участники класса, которые объявлены защищенными или public наследуются подклассами заявлено в пакете, кроме тот, в котором объявлен класс.

Полезная ссылка: Наследуют ли подклассы приватные поля?

2 голосов
/ 27 апреля 2012

IMO ни в коем случае не является вопросом определения.В наследовании на основе классов подразумевается распространение поведения на потомков.Поскольку такие частные члены получают наследство, и я не буду вдаваться в подробности, как это происходит.

На самом деле я считаю, что «не унаследованный» ответ опасен для новых разработчиков, и они не сразу понимают, чточастные члены скрыты под кожей вашего класса, и они (могут) оказывать серьезное влияние на его поведение, размер объектов и т. д.

Обычно в компьютерной науке «развитие предшествует пониманию», однакодавайте не будем строить (или разрушать) нашу концептуализацию ООП, предполагая, что неверное «определение», принятое некоторым техником, пишущим руководство для хорошо известной платформы ОО на базе классов.проблема всегда действительна.

1 голос
/ 28 июля 2018

Хотя https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2 показывает, что частные члены не наследуются. На самом деле, это наследуется подклассом. Когда мы используем отладчики для отслеживания переменных, он будет показывать закрытые члены под меткой «унаследовано», поэтому просто попробуйте. есть еще один пост, обсуждающий этот вопрос, и большинство из них считают, что он не унаследован, что вводит в заблуждение многих людей, в том числе и меня вначале.

0 голосов
/ 03 ноября 2018

Вы будете удовлетворены здесь на 100%.Я проверил это на своем компьютере, и на основании этого я опубликую его здесь.Просто пройдите программу, написанную ниже, посмотрите вывод программы и ПРОЧИТАЙТЕ ЗАКЛЮЧЕНИЕ, приведенное в конце.Чтобы проверить это самостоятельно, скопируйте всю программу и сохраните ее в файле с именем «InheritanceTest.java», затем скомпилируйте и, наконец, запустите.

Программа

// Testing if a subclass can access the private members of a superclass

class Class1 {
    private String name;

    public void setName(String name) {
        this.name = name;
        System.out.println("The name has been set successfully.");
    }

    public void showName() {
        System.out.println("The name is: " + name);
    }
}

class Class2 extends Class1 {
    private int age;

    public void setAge(int age) {
        this.age = age;
        System.out.println("The age has been set successfully.");
    }

    public void showAge() {
        System.out.println("The age is: " + age);
    }

    public void displayName() {
        //Accessing the private member of superclass here
        //System.out.println("The name is: " + name); //error, can't compile because access to the private member name of the superclass Class1 is not permitted here.
    }
}

class InheritanceTest {
    public static void main(String[] args) {

        Class1 c1 = new Class1();
        Class2 c2 = new Class2();

        c1.setName("Name_C1");
        c2.setName("Name_C2"); //No error, setName() is a public member of the superclass which indirectly gives access to the private member "name".

        c1.showName();
        c2.showName(); //No error, showName() is a public member of the superclass which indirectly gives access to the private member "name".

        c2.setAge(25);
        c2.showAge();

        //c2.displayName(); //error
    }
}

Вывод

The name has been set successfully.
The name has been set successfully.
The name is: Name_C1
The name is: Name_C2
The age has been set successfully.
The age is: 25

Заключение

Да, подкласс может косвенно обращаться к закрытым членам суперкласса.Подкласс не может напрямую обращаться к закрытым членам суперкласса.

Все открытые, закрытые и защищенные члены (т. Е. Все поля и методы) суперкласса наследуются подклассом, но подкласс может иметь прямой доступтолько общественные и защищенные члены суперкласса.Если унаследованный член от суперкласса предоставляет доступ к закрытому члену суперкласса, тогда подкласс может использовать этот унаследованный член для доступа к закрытому члену суперкласса.

...