Sobes.tech
Junior — Middle
63

Какое отличие между модификаторами доступа protected и package-private (default) в языке Java?

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

sobes.tech AI

В Java модификатор доступа protected и пакетный (package-private, или default, когда модификатор не указан) имеют разные уровни видимости:

  • package-private (default): доступ разрешён только классам из того же пакета.
  • protected: доступ разрешён классам из того же пакета и подклассам (даже если они находятся в другом пакете).

То есть protected расширяет доступ по сравнению с package-private, позволяя наследникам из других пакетов обращаться к защищённым членам.

Пример:

package pkg1;
public class Parent {
    int defaultVar; // package-private
    protected int protectedVar;
}

package pkg1;
public class SamePackage {
    void test() {
        Parent p = new Parent();
        int a = p.defaultVar;    // доступ есть
        int b = p.protectedVar;  // доступ есть
    }
}

package pkg2;
import pkg1.Parent;
public class Child extends Parent {
    void test() {
        int a = defaultVar;    // нет доступа (package-private)
        int b = protectedVar;  // доступ есть (protected + наследование)
    }
}

package pkg2;
import pkg1.Parent;
public class Other {
    void test() {
        Parent p = new Parent();
        int a = p.defaultVar;    // нет доступа
        int b = p.protectedVar;  // нет доступа (не наследник)
    }
}

Таким образом, protected даёт доступ наследникам вне пакета, а package-private — только внутри пакета.