public / protected / private
Модификаторы доступа задают, откуда виден класс, поле, метод или конструктор.
Доступно с: Java 1.0
Синтаксис
public | protected | private | (no modifier) — package-privateПримеры
Типичная инкапсуляция: поле закрыто, работа с ним — через открытые методы:
class Account {
private int balance;
public void deposit(int amount) {
if (amount <= 0) {
throw new IllegalArgumentException("amount must be positive");
}
balance += amount;
}
public int getBalance() {
return balance;
}
}
void main() {
Account account = new Account();
account.deposit(100);
IO.println(account.getBalance());
}Результат:
100Обращение к закрытому полю из другого класса верхнего уровня не компилируется:
// src/Shop.java
public class Shop {
void pay(Account account) {
account.balance = 1_000_000; // error: balance has private access in Account
}
}Примечания
Видимость от узкой к широкой:
| Модификатор | Класс | Пакет | Наследники | Везде |
|---|---|---|---|---|
private | да | нет | нет | нет |
| без модификатора | да | да | нет | нет |
protected | да | да | да | нет |
public | да | да | да | да |
Поля почти всегда делают private, а наружу открывают только нужные методы. Класс верхнего уровня может быть только public или без модификатора, и public-класс должен лежать в файле со своим именем. В компактном файле все классы вложены в один неявный класс, поэтому private между ними не действует — проверяйте доступ на обычных файлах.
См. также
- import / package — package задаёт пакет файла, import позволяет писать короткие имена классов из других пакетов.
- class — Объявляет класс — описание объектов: их полей и методов.
- extends — Объявляет наследование: класс получает поля и методы родителя.
- static — Делает поле или метод общим для всего класса, а не для отдельного объекта.
В учебнике
- Пакеты и модификаторы доступа — Пакеты и import в Java, модификаторы public, protected, private и доступ по умолчанию, сборка и запуск проекта из нескольких файлов.