Как работает модификатор доступа protected в Java?

«Как работает модификатор доступа protected в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Модификатор protected в Java определяет уровень доступа к членам класса (полям, методам, конструкторам). Доступ к protected-члену разрешен из:

  1. Того же класса.
  2. Классов-наследников (подклассов), даже если они находятся в другом пакете.
  3. Классов внутри того же пакета (как и при default (package-private) доступе).

Пример:

// Файл: animals/Animal.java
package animals;

public class Animal {
    protected String name; // Доступно в подклассах и пакете animals

    protected void eat() {
        System.out.println(name + " is eating");
    }
}

// Файл: pets/Dog.java (другой пакет, но наследник)
package pets;
import animals.Animal;

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

Когда использовать: protected применяется, когда нужно скрыть реализацию от внешнего кода, но предоставить доступ для расширения функциональности в классах-наследниках (например, в шаблонном методе).