Я ответил "Нет", потому что мы не можем получить к ним доступ, используя "обычный способ ООП". Но интервьюер думает, что они наследуются, потому что мы можем получить доступ к таким полям косвенно или с помощью отражения, и они все еще существуют в объекте.
После того, как я вернулся, я нашел следующую цитату в javadoc:
Закрытые члены в суперклассе
Подкласс не наследует закрытые члены своего родительского класса.
Знаете ли вы какие-либо аргументы в пользу мнения интервьюера?
Переведено автоматически
Ответ 1
Большая часть путаницы в приведенных здесь вопросах / ответах связана с определением наследования.
Очевидно, как объясняет @DigitalRoss, ОБЪЕКТ подкласса должен содержать закрытые поля своего суперкласса. Как он утверждает, отсутствие доступа к закрытому члену не означает, что его там нет.
Однако. Это отличается от понятия наследования для класса. Как и в случае с миром Java, где возникает вопрос семантики, арбитром является спецификация языка Java (в настоящее время 3-я редакция).
Члены класса, объявленные закрытыми, не наследуются подклассами этого класса. Только члены класса, которые объявлены защищенными или общедоступными, наследуются подклассами, объявленными в пакете, отличном от того, в котором объявлен класс.
Это точно отвечает на вопрос, заданный интервьюером: "Наследуют ли КЛАССЫ приватные поля". (выделено мной)
Ответ - Нет. Они этого не делают. ОБЪЕКТЫ подклассов содержат закрытые поля своих суперклассов. Сам подкласс НЕ имеет ПОНЯТИЯ о закрытых полях своего суперкласса.
Это семантика педантичного характера? ДА. Это полезный вопрос для собеседования? Вероятно, нет. Но JLS устанавливает определение для мира Java, и оно делает это (в данном случае) однозначно.
ОТРЕДАКТИРОВАНО (удалена параллельная цитата из Бьярне Страуструпа, которая из-за различий между java и c ++, вероятно, только усугубляет путаницу. Я позволю своему ответу остановиться на JLS :)
Ответ 2
ДА
Важно понимать, что, хотя существует два класса, существует только один объект.
Итак, да, конечно, он унаследовал приватные поля. Предположительно, они необходимы для правильной функциональности объекта, и хотя объект родительского класса не является объектом производного класса, экземпляр производного класса в большинстве случаев определенно является экземпляром родительского класса. Этого не могло бы быть без всех полей.
Нет, вы не можете получить к ним прямой доступ. Да, они наследуются. Они должны быть.
Хороший вопрос!
Обновить:
Ошибка, "Нет"
Что ж, я думаю, мы все чему-то научились. Поскольку в JLS появилась точная формулировка "не наследуется", правильно ответить "нет". Поскольку подкласс не может получить доступ к закрытым полям или изменить их, то, другими словами, они не наследуются. Но на самом деле есть только один объект, он действительно содержит закрытые поля, и поэтому, если кто-то неправильно воспримет JLS и формулировку руководства, будет довольно сложно понять ООП, объекты Java и то, что происходит на самом деле.
Обновление за обновлением:
Противоречие здесь связано с фундаментальной двусмысленностью: что именно обсуждается?Объект? Или мы говорим в некотором смысле о самом классе? При описании класса, в отличие от объекта, допускается большая свобода действий. Таким образом, подкласс не наследует закрытые поля, но объект, являющийся экземпляром подкласса, безусловно, содержит закрытые поля.
Ответ 3
Нет. Закрытые поля не наследуются ... и именно поэтому был изобретен Protected . Это сделано специально. Я думаю, это оправдывало существование модификатора protected .
Теперь перейдем к контекстам. Что вы подразумеваете под унаследованным - если оно есть в объекте, созданном из производного класса? да, это так.
Если вы имеете в виду, может ли это быть полезно для производного класса. Ну, нет.
Теперь, когда вы переходите к функциональному программированию, приватное поле суперкласса не наследуется значимым образом для подкласса. Для подкласса приватное поле суперкласса такое же, как приватное поле любого другого класса.
Функционально это не наследуется. Но в идеале это так.
ОК, только что заглянул в учебник по Java, там цитируется это:
Закрытые члены в суперклассе
Подкласс не наследует закрытые члены своего родительского класса. Однако, если у суперкласса есть общедоступные или защищенные методы для доступа к своим закрытым полям, они также могут использоваться подклассом.
Я согласен, что это поле есть. Но подкласс не получает никаких привилегий в отношении этого приватного поля. Для подкласса приватное поле такое же, как любое приватное поле любого другого класса.
Я считаю, что это чисто вопрос точки зрения. Вы можете сформулировать аргумент любой стороны. Лучше обосновать оба варианта.
Ответ 4
Это зависит от вашего определения "inherit". У подкласса все еще есть поля в памяти? Определенно. Может ли он получить к ним прямой доступ? Нет. Это всего лишь тонкости определения; суть в том, чтобы понять, что происходит на самом деле.