Про модификаторы доступа в Java (public / default / protected / private)
private - только для себя
public - откуда угодно
protected - вроде бы для подклассов?
На самом деле тут всегда начинается каша, если не смотреть на вопрос "откуда и кто вызывает" по двум осям: пакет и наследование.
Чтобы нормально понять модификаторы, я подумал: пусть будет статья с моделью "якинику-ресторан".
Что такое модификаторы на самом деле:
Модификаторы - это не про "силу".
Это правила, откуда можно получить доступ.
В Java доступ всегда определяется двумя вещами:
* тот же пакет?
* есть наследование?
Модель с рестораном якинику:
* YakinikuShop: сам ресторан (родительский класс)
* LocalStaff: персонал этого же ресторана
* Manager: управляющий (дочерний класс)
* BranchStaff: персонал филиала (другой пакет + наследник)
* Customer: обычный клиент
Родительский класс:
YakinikuShop.javapackage shop;
public class YakinikuShop {
public int counter = 30; // Стойка/места: видно всем
int staffRoom = 10; // Комната персонала: только для своего пакета
protected int kitchen = 20; // Кухня: свой пакет или наследники
private int safeMoney = 100; // Сейф: даже управляющему напрямую нельзя
public void askManagerToOpenSafe(Object person) {
if (!(person instanceof Manager)) {
System.out.println("❌ Только управляющий может открыть сейф");
return;
}
openSafe();
}
private void openSafe() {
System.out.println("open safe: " + safeMoney);
}
}
Почему askManagerToOpenSafe "особенный"
askManagerToOpenSafe - public.
То есть вызвать его может кто угодно.
Но откроется сейф или нет - решает проверка instanceof внутри.
public != "можно всё"
public = "вход виден и доступен"
Суть public вот такая:
* ✅может вызвать клиент
* ✅может вызвать персонал
* ✅может вызвать кто-то из другого магазина
"Встать у входа и попросить" можно, но:
* ❌ если ты не управляющий - тебя сразу разворачивают
* ❌ private-сейф напрямую трогать нельзя
Таблица доступа:
Клиент:
public: ✅
default: ❌
protected: ❌
private: ❌
Персонал этого же ресторана (тот же пакет):
public: ✅
default: ✅
protected: ✅
private: ❌
Персонал филиала (другой пакет, но наследник):
public: ✅
default: ❌
protected: ✅
private: ❌
Управляющий (дочерний класс):
public: ✅
default: ✅
protected: ✅
private: ❌
Сам класс YakinikuShop:
public: ✅
default: ✅
protected: ✅
private: ✅
👉
Java Portal