Ответ
Нет, не имеет. Приватные (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-полю
}
}
Как получить доступ к данным родителя?
- Использовать модификатор
protected: Поля и методы с этим модификатором доступны наследникам и классам в том же пакете. - Предоставить публичные или protected методы-геттеры/сеттеры в родительском классе.
- Использовать модификатор доступа по умолчанию (package-private), если наследник находится в том же пакете.
Это фундаментальный принцип инкапсуляции в ООП: внутреннее состояние объекта должно быть скрыто от внешнего мира, включая его подклассы, если явно не разрешено иначе.
Ответ 18+ 🔞
Да ты посмотри, какая история интересная вырисовывается! Сидит себе класс-родитель, такой весь в себе, и заводит приватное поле secret. Ну, типа, его личное дело, его тайна, блядь. А тут приходит наследничек, думает: «А, папино — значит, моё!». И давай лезть в этот самый secret напрямую.
А ему компилятор, такой: «Опа-опа, куда прешь, дружок? Это private, ёпта! Ты чё, не видишь?». И нахуй посылает с ошибкой компиляции. Прямо как в жизни: отцовский сейф с документами — он же на замке, блядь! Не можешь ты просто так взять и открыть его, даже будучи родным сыном. Инкапсуляция, сука, называется! Святое дело — прятать свои кишки.
Ну а как тогда быть, если очень надо? А элементарно, Ватсон! Папаша может оставить ключи под ковриком. То есть:
- Сделать поле не
private, аprotected. Тогда наследничек уже сможет его трогать. Это как общий семейный сейф в прихожей. - Или, что чаще и правильнее, наделать публичных методов-геттеров. Типа
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 — это священная корова, её не трогают. А то раздербанишь всё, потом охуеешь, когда что-то сломается.