Назад к вопросам
Junior
67
questionbank

Расскажите о модификаторах доступа в Java.

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Java существует четыре модификатора доступа, которые определяют видимость классов, членов (полей и методов) и конструкторов.

  1. public

    • Видимость: Везде (внутри пакета и извне).
    • Применимость: Классы, интерфейсы, члены, конструкторы.
  2. protected

    • Видимость: Внутри пакета и во всех подклассах (даже в другом пакете).
    • Применимость: Члены, конструкторы.
  3. (Без модификатора) или default / package-private

    • Видимость: Только внутри пакета.
    • Применимость: Классы, интерфейсы, члены, конструкторы.
  4. 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();
    }
}