Имеет ли класс-наследник в Java доступ к приватным полям родительского класса?

«Имеет ли класс-наследник в Java доступ к приватным полям родительского класса?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Пример:

public class Parent {
    private String secret = "Parent's secret";
    protected String familyData = "Shared data";
}

public class Child extends Parent {
    void tryAccess() {
        // System.out.println(secret); // ОШИБКА КОМПИЛЯЦИИ: secret has private access in Parent
        System.out.println(familyData); // OK: доступ к protected-полю
    }
}

Как получить доступ к данным родителя?

  1. Использовать модификатор protected: Поля и методы с этим модификатором доступны наследникам и классам в том же пакете.
  2. Предоставить публичные или protected методы-геттеры/сеттеры в родительском классе.
  3. Использовать модификатор доступа по умолчанию (package-private), если наследник находится в том же пакете.

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