Ответ
В Java четыре модификатора доступа, которые контролируют инкапсуляцию, определяя, из каких других классов можно получить доступ к члену (полю, методу, конструктору) или самому классу.
| Модификатор | Класс | Пакет (Package) | Подкласс (Наследник) | Остальной мир (World) |
|---|---|---|---|---|
private |
Да | Нет | Нет | Нет |
default (package-private) |
Да | Да | Нет | Нет |
protected |
Да | Да | Да | Нет |
public |
Да | Да | Да | Да |
Пример и объяснение:
package com.example;
public class AccessModifiersDemo {
private String secret = "Только внутри этого класса"; // private
String packagePrivate = "Доступен в пакете com.example"; // default (package-private)
protected String forSubclasses = "Доступен в пакете и подклассах"; // protected
public String api = "Доступен отовсюду"; // public
// private конструктор используется в Singleton или Factory
private AccessModifiersDemo() {}
}
// Другой класс в том же пакете `com.example`
class SamePackageClass {
void method() {
AccessModifiersDemo demo = new AccessModifiersDemo();
// demo.secret; // ОШИБКА: private недоступен
System.out.println(demo.packagePrivate); // OK: default доступен в пакете
System.out.println(demo.forSubclasses); // OK: protected доступен в пакете
System.out.println(demo.api); // OK: public доступен везде
}
}
Ключевые принципы:
- Используйте самый строгий из возможных модификаторов. Начинайте с
privateи расширяйте доступ при необходимости. - Поля класса почти всегда должны быть
private(инкапсуляция), доступ к ним — черезpublic/protectedгеттеры/сеттеры. publicкласс должен быть объявлен в отдельном файле с именемClassName.java.protectedпредоставляет доступ подклассам, даже если они находятся в другом пакете.