Какой модификатор доступа в Java позволяет наследнику получить доступ к полю родительского класса?

Ответ

protected — модификатор, который разрешает доступ к члену класса (полю или методу) из:

  1. Того же пакета.
  2. Любого класса-наследника, даже если он находится в другом пакете.

Пример:

class Parent {
    protected int protectedValue = 42;
    private int privateValue = 100; // Недоступен наследнику
}

class Child extends Parent {
    void printValues() {
        System.out.println(protectedValue); // Доступ разрешен
        // System.out.println(privateValue); // Ошибка компиляции: private
    }
}

Сравнение с другими модификаторами:

  • private — доступ только внутри объявляющего класса.
  • default (package-private) — доступ только внутри того же пакета.
  • public — доступ отовсюду.

Ответ 18+ 🔞

А, ну это про protected, да? Ёпта, классика, вечно её с чем-то путают. Сейчас разложу по полочкам, чтобы у тебя в голове всё встало на свои места, а не болталось как манда с ушами.

Представь себе, что у тебя есть класс-родитель, типа такой семейной реликвии. И есть поле в нём, помеченное protected. Это как семейный секрет, который ты можешь:

  1. Рассказать всем родственникам, которые живут с тобой в одной квартире (в одном пакете). Им всё можно.
  2. Шёпотом передать своему сыну, даже если он уехал жить в другой город (в другой пакет). Наследникам — тоже зелёный свет.

А вот соседу с пятого этажа (какому-то случайному классу из другого пакета) ты этот секрет не расскажешь. Ему доверия — ноль ебать.

Вот смотри, наглядный пиздец, то есть пример:

class Parent {
    protected int secretIngredient = 42; // Секретный ингредиент семейного соуса
    private int bankPassword = 100; // А это уже совсем своё, приватное
}

class Child extends Parent {
    void tryToKnowEverything() {
        System.out.println(secretIngredient); // Всё ок, сынок, знай наш секрет. 42.
        // System.out.println(bankPassword); // А вот это, сынок, нихуя. Ошибка компиляции.
    }
}

Видишь? Наследник (Child) может спокойно трогать protected поле. А вот private — это уже за гранью, это личное дело родителя, туда даже родная кровь не пускается.

А теперь, чтобы вообще не было сомнений, вот тебе вся иерархия доступа, от самого жадного до самого распиздяйского:

  • private — это как твой личный дневник в сейфе. Только ты (твой класс). Всё. Наследники пусть идут нахуй, они него не увидят нихуя.
  • default (он же package-private) — это как общий холодильник на общей кухне (в пакете). Все, кто живёт в этой квартире (в пакете), могут туда лазить. А кто с другой улицы (из другого пакета) — нет, даже если он твой брат (наследник).
  • protected — это наш сегодняшний герой. Всем в пакете + всем детям, даже уехавшим. Идеальный баланс для семейных дел.
  • public — это вывесить информацию на доску объявлений на центральной площади. Всем, везде, всегда. Полный распиздяйский режим.

Запомни эту разницу, а то потом будешь охуевать, почему наследник в другом пакете не видит твоих полей. Всё просто, если знать правила.