Подклассы наследуют частные поля? - PullRequest
227 голосов
/ 17 января 2011

Это вопрос интервью.

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

Я ответил "Нет", потому что мы не можем получить к ним доступ, используя "обычный"ООП путь ".Но интервьюер считает, что они наследуются, потому что мы можем получить доступ к таким полям косвенно или с помощью отражения, и они все еще существуют в объекте.

После того, как я вернулся, я нашел следующую цитату в javadoc :

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

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

Знаете ли вы какие-либо аргументыпо мнению интервьюера?

Ответы [ 17 ]

1 голос
/ 07 мая 2017

Memory Layout in Java vis-a-vis inheritance

enter image description here

Заполнение битов / выравнивание и включение класса объекта в VTABLE не рассматривается. Таким образом, объект подкласса имеет место для частных членов класса Super. Однако к нему нельзя получить доступ из объектов подкласса ...

0 голосов
/ 30 ноября 2012

Полагаю, ответ полностью зависит от вопроса, который был задан. Я имею в виду, если вопрос

Можем ли мы напрямую получить доступ к закрытому полю суперкласса из их подкласс?

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

Но, если вопрос

Можем ли мы получить доступ к закрытому полю суперкласса из их подкласс?

Это означает, что не имеет значения, что вы будете делать, чтобы получить доступ к частному участнику. В этом случае мы можем сделать публичный метод в суперклассе, и вы сможете получить доступ к приватному члену. Итак, в этом случае вы создаете один интерфейс / мост для доступа к приватному члену.

Другие языки ООП, такие как C ++, имеют концепцию friend function, с помощью которой мы можем получить доступ к закрытому члену другого класса.

0 голосов
/ 29 января 2016

Закрытый член класса или конструктор доступен только внутри тела класса верхнего уровня ( §7.6 ), который включает в себя объявление члена или конструктора.Он не наследуется подклассами.https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6

0 голосов
/ 27 февраля 2015

Я бы ответил, что частные поля в Java унаследованы.Позвольте мне продемонстрировать:

public class Foo {

    private int x; // This is the private field.

    public Foo() {
        x = 0; // Sets int x to 0.
    }

    //The following methods are declared "final" so that they can't be overridden.
    public final void update() { x++; } // Increments x by 1.
    public final int getX() { return x; } // Returns the x value.

}


public class Bar extends Foo {

    public Bar() {

        super(); // Because this extends a class with a constructor, it is required to run before anything else.

        update(); //Runs the inherited update() method twice
        update();
        System.out.println(getX()); // Prints the inherited "x" int.

    }

}

Если вы запустите программу Bar bar = new Bar();, то вы всегда увидите число «2» в поле вывода.Поскольку целое число "x" инкапсулировано с методами update() и getX(), то можно доказать, что целое число наследуется.

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

0 голосов
/ 30 сентября 2014

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

0 голосов
/ 31 мая 2012

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

Хотя наследование имеет определение "defacto", оно определенно не имеетссылка на аспекты «видимости», которые предполагаются «нет» ответы.

Таким образом, нет необходимости быть дипломатичным.JLS просто ошибочен.

Любое предположение, что они не "унаследованы", небезопасно и опасно.

Таким образом, среди двух де-факто (частично) противоречивых определений (которые я не буду повторять)единственный, которому нужно следовать, это тот, который безопаснее (или безопаснее).

0 голосов
/ 25 марта 2013

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

...