Назад к вопросам
Junior
67
questionbank
Расскажите о модификаторах доступа в Java.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Java существует четыре модификатора доступа, которые определяют видимость классов, членов (полей и методов) и конструкторов.
-
public- Видимость: Везде (внутри пакета и извне).
- Применимость: Классы, интерфейсы, члены, конструкторы.
-
protected- Видимость: Внутри пакета и во всех подклассах (даже в другом пакете).
- Применимость: Члены, конструкторы.
-
(Без модификатора) или
default/ package-private- Видимость: Только внутри пакета.
- Применимость: Классы, интерфейсы, члены, конструкторы.
-
private- Видимость: Только внутри того же класса.
- Применимость: Члены, конструкторы.
Сводная таблица видимости:
| Модификатор | Внутри класса | Внутри пакета | Подклассы (другой пакет) | Все классы (другой пакет) |
|---|---|---|---|---|
private |
Да | Нет | Нет | Нет |
default |
Да | Да | Нет | Нет |
protected |
Да | Да | Да | Нет |
public |
Да | Да | Да | Да |
Пример использования:
// В пакете: com.example.package1
package com.example.package1;
public class ClassA {
private int privateVar;
int defaultVar; // default (package-private)
protected int protectedVar;
public int publicVar;
private void privateMethod() {}
void defaultMethod() {}
protected void protectedMethod() {}
public void publicMethod() {}
}
// В пакете: com.example.package1 (тот же пакет)
package com.example.package1;
public class ClassB {
public void accessClassA() {
ClassA objA = new ClassA();
// objA.privateVar = 10; // Ошибка: private
objA.defaultVar = 20;
objA.protectedVar = 30;
objA.publicVar = 40;
// objA.privateMethod(); // Ошибка: private
objA.defaultMethod();
objA.protectedMethod();
objA.publicMethod();
}
}
// В пакете: com.example.package2 (другой пакет)
package com.example.package2;
import com.example.package1.ClassA;
public class ClassC extends ClassA { // Подкласс ClassA
public void accessClassA() {
// Через унаследованный объект (this или объект типа ClassC)
// privateVar недоступен
// defaultVar недоступен в другом пакете
protectedVar = 50; // Доступен protected из подкласса
publicVar = 60;
// privateMethod() недоступен
// defaultMethod() недоступен в другом пакете
protectedMethod(); // Доступен protected из подкласса
publicMethod();
}
public void accessClassAFromOtherInstance() {
ClassA objA = new ClassA();
// privateVar недоступен
// defaultVar недоступен
// objA.protectedVar = 70; // Ошибка: protected доступен только из подкласса через наследование, а не через другой экземпляр
objA.publicVar = 80;
// privateMethod() недоступен
// defaultMethod() недоступен
// objA.protectedMethod(); // Ошибка
objA.publicMethod();
}
}
// В пакете: com.example.package2 (другой пакет)
package com.example.package2;
import com.example.package1.ClassA;
public class ClassD { // НЕ подкласс ClassA
public void accessClassA() {
ClassA objA = new ClassA();
// privateVar недоступен
// defaultVar недоступен
// protectedVar недоступен
objA.publicVar = 90;
// privateMethod() недоступен
// defaultMethod() недоступен
// protectedMethod() недоступен
objA.publicMethod();
}
}