Имеет ли класс-наследник в 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), если наследник находится в том же пакете.

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

Ответ 18+ 🔞

Да ты посмотри, какая история интересная вырисовывается! Сидит себе класс-родитель, такой весь в себе, и заводит приватное поле secret. Ну, типа, его личное дело, его тайна, блядь. А тут приходит наследничек, думает: «А, папино — значит, моё!». И давай лезть в этот самый secret напрямую.

А ему компилятор, такой: «Опа-опа, куда прешь, дружок? Это private, ёпта! Ты чё, не видишь?». И нахуй посылает с ошибкой компиляции. Прямо как в жизни: отцовский сейф с документами — он же на замке, блядь! Не можешь ты просто так взять и открыть его, даже будучи родным сыном. Инкапсуляция, сука, называется! Святое дело — прятать свои кишки.

Ну а как тогда быть, если очень надо? А элементарно, Ватсон! Папаша может оставить ключи под ковриком. То есть:

  1. Сделать поле не private, а protected. Тогда наследничек уже сможет его трогать. Это как общий семейный сейф в прихожей.
  2. Или, что чаще и правильнее, наделать публичных методов-геттеров. Типа public String getSecret(). Это как папа сам тебе нужную бумажку из сейфа достанет и вручит. Контроль, блядь, остаётся у него!

Смотри на код, тут всё ясно:

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); // Тут будет пиздец и ошибка. Private, ёпта!
        System.out.println(familyData); // А тут всё окей, protected же!
        // А чтобы получить secret, надо было бы, чтобы Parent завел public String getSecret()
    }
}

Вот и весь сказ, блядь. Наследование — это не вседозволенность, а так, расширение прав, но в рамках устава. Private — это священная корова, её не трогают. А то раздербанишь всё, потом охуеешь, когда что-то сломается.