Вопрос-ответ

Do subclasses inherit private fields?

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

Это вопрос для собеседования.


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


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

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


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


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


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

Переведено автоматически
Ответ 1

Большая часть путаницы в приведенных здесь вопросах / ответах связана с определением наследования.

Очевидно, как объясняет @DigitalRoss, ОБЪЕКТ подкласса должен содержать закрытые поля своего суперкласса. Как он утверждает, отсутствие доступа к закрытому члену не означает, что его там нет.

Однако. Это отличается от понятия наследования для класса. Как и в случае с миром Java, где возникает вопрос семантики, арбитром является спецификация языка Java (в настоящее время 3-я редакция).

Как указано в JLS (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2):


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


Это точно отвечает на вопрос, заданный интервьюером: "Наследуют ли КЛАССЫ приватные поля". (выделено мной)

Ответ - Нет. Они этого не делают. ОБЪЕКТЫ подклассов содержат закрытые поля своих суперклассов. Сам подкласс НЕ имеет ПОНЯТИЯ о закрытых полях своего суперкласса.

Это семантика педантичного характера? ДА. Это полезный вопрос для собеседования? Вероятно, нет. Но JLS устанавливает определение для мира Java, и оно делает это (в данном случае) однозначно.

ОТРЕДАКТИРОВАНО (удалена параллельная цитата из Бьярне Страуструпа, которая из-за различий между java и c ++, вероятно, только усугубляет путаницу. Я позволю своему ответу остановиться на JLS :)

Ответ 2

ДА

Важно понимать, что, хотя существует два класса, существует только один объект.

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

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

Хороший вопрос!


Обновить:

Ошибка, "Нет"

Что ж, я думаю, мы все чему-то научились. Поскольку в JLS появилась точная формулировка "не наследуется", правильно ответить "нет". Поскольку подкласс не может получить доступ к закрытым полям или изменить их, то, другими словами, они не наследуются. Но на самом деле есть только один объект, он действительно содержит закрытые поля, и поэтому, если кто-то неправильно воспримет JLS и формулировку руководства, будет довольно сложно понять ООП, объекты Java и то, что происходит на самом деле.

Обновление за обновлением:

Противоречие здесь связано с фундаментальной двусмысленностью: что именно обсуждается? Объект? Или мы говорим в некотором смысле о самом классе? При описании класса, в отличие от объекта, допускается большая свобода действий. Таким образом, подкласс не наследует закрытые поля, но объект, являющийся экземпляром подкласса, безусловно, содержит закрытые поля.

Ответ 3

Нет. Закрытые поля не наследуются ... и именно поэтому был изобретен Protected . Это сделано специально. Я думаю, это оправдывало существование модификатора protected .


Теперь перейдем к контекстам. Что вы подразумеваете под унаследованным - если оно есть в объекте, созданном из производного класса? да, это так.

Если вы имеете в виду, может ли это быть полезно для производного класса. Ну, нет.

Теперь, когда вы переходите к функциональному программированию, приватное поле суперкласса не наследуется значимым образом для подкласса. Для подкласса приватное поле суперкласса такое же, как приватное поле любого другого класса.

Функционально это не наследуется. Но в идеале это так.


ОК, только что заглянул в учебник по Java, там цитируется это:


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


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


см.: http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html

Я согласен, что это поле есть. Но подкласс не получает никаких привилегий в отношении этого приватного поля. Для подкласса приватное поле такое же, как любое приватное поле любого другого класса.

Я считаю, что это чисто вопрос точки зрения. Вы можете сформулировать аргумент любой стороны. Лучше обосновать оба варианта.

 

Ответ 4

Это зависит от вашего определения "inherit". У подкласса все еще есть поля в памяти? Определенно. Может ли он получить к ним прямой доступ? Нет. Это всего лишь тонкости определения; суть в том, чтобы понять, что происходит на самом деле.

2024-02-03 10:35 java oop inheritance