Какой модификатор доступа в Java предоставляет доступ элементам того же пакета и классам-наследникам?

«Какой модификатор доступа в Java предоставляет доступ элементам того же пакета и классам-наследникам?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это модификатор protected.

Почему именно он? В Java protected объединяет доступность package-private (элементы того же пакета) и добавляет возможность доступа для классов-наследников, даже если они находятся в других пакетах.

Практический пример:

// Файл: com/example/animal/Animal.java
package com.example.animal;

public class Animal {
    protected String name; // Доступно в пакете и наследникам
    protected void eat() {
        System.out.println("Eating...");
    }
}
// Файл: com/example/pet/Dog.java
package com.example.pet;

import com.example.animal.Animal;

public class Dog extends Animal { // Наследник из другого пакета
    public void bark() {
        eat();    // OK: метод protected
        name = "Rex"; // OK: поле protected
    }
}

Краткая сводка по модификаторам Java:

  1. private – доступ только внутри своего класса.
  2. default (package-private) – доступ внутри пакета (модификатор не указан).
  3. protected – доступ внутри пакета + для классов-наследников.
  4. public – доступ отовсюду.