«1. Обзор

В этом руководстве мы рассмотрим модификаторы доступа в Java, которые используются для установки уровня доступа к классам, переменным, методам и конструкторам.

Проще говоря, есть четыре модификатора доступа: общедоступный, частный, защищенный и по умолчанию (без ключевого слова).

Прежде чем мы начнем, отметим, что класс верхнего уровня может использовать только общедоступные модификаторы доступа или модификаторы доступа по умолчанию. На уровне члена мы можем использовать все четыре.

2. По умолчанию

Когда мы не используем какое-либо ключевое слово явно, Java установит доступ по умолчанию к данному классу, методу или свойству. Модификатор доступа по умолчанию также называется package-private, что означает, что все элементы видны внутри одного пакета, но недоступны из других пакетов:

package com.baeldung.accessmodifiers;

public class SuperPublic {
    static void defaultMethod() {
        ...
    }
}

defaultMethod() доступен в другом классе того же пакета:

package com.baeldung.accessmodifiers;

public class Public {
    public Public() {
        SuperPublic.defaultMethod(); // Available in the same package.
    }
}

Однако он недоступен в других пакетах.

3. Public

Если мы добавим ключевое слово public к классу, методу или свойству, то мы сделаем его доступным для всего мира, т. е. все остальные классы во всех пакетах смогут его использовать. Это наименее ограничивающий модификатор доступа:

package com.baeldung.accessmodifiers;

public class SuperPublic {
    public static void publicMethod() {
        ...
    }
}

publicMethod() доступен в другом пакете:

package com.baeldung.accessmodifiers.another;

import com.baeldung.accessmodifiers.SuperPublic;

public class AnotherPublic {
    public AnotherPublic() {
        SuperPublic.publicMethod(); // Available everywhere. Let's note different package.
    }
}

Подробнее о том, как ключевое слово public ведет себя при применении к классу, интерфейсу, вложенному публичному классу или интерфейс и метод см. в специальной статье.

4. Private

Любой метод, свойство или конструктор с ключевым словом private доступен только из того же класса. Это наиболее ограничивающий модификатор доступа, который является основой концепции инкапсуляции. Все данные будут скрыты от внешнего мира:

package com.baeldung.accessmodifiers;

public class SuperPublic {
    static private void privateMethod() {
        ...
    }
    
     private void anotherPrivateMethod() {
         privateMethod(); // available in the same class only.
    }
}

Эта более подробная статья покажет, как ключевое слово private ведет себя при применении к полю, конструктору, методу и внутреннему классу.

5. Protected

Между публичным и частным уровнями доступа есть модификатор защищенного доступа.

Если мы объявим метод, свойство или конструктор с ключевым словом protected, мы сможем получить доступ к члену из того же пакета (как и при уровне доступа package-private) и дополнительно из всех подклассов его класса, даже если они лежат в другие пакеты:

package com.baeldung.accessmodifiers;

public class SuperPublic {
    static protected void protectedMethod() {
        ...
    }
}

protectedMethod() доступен в подклассах (независимо от пакета):

package com.baeldung.accessmodifiers.another;

import com.baeldung.accessmodifiers.SuperPublic;

public class AnotherSubClass extends SuperPublic {
    public AnotherSubClass() {
        SuperPublic.protectedMethod(); // Available in subclass. Let's note different package.
    }
}

В специальной статье подробнее о ключевом слове при использовании в поле, методе, конструкторе, внутреннем классе и доступность в том же или другом пакете.

6. Сравнение

В таблице ниже приведены доступные модификаторы доступа. Мы видим, что класс, независимо от используемых модификаторов доступа, всегда имеет доступ к своим членам:

Modifier Class Package Subclass World
public
Y Y Y Y
protected
Y Y Y N
default
Y Y N N
private
Y N N N

7. Заключение

В этой короткой статье мы рассмотрели модификаторы доступа в Java.

Хорошей практикой является использование максимально ограниченного уровня доступа для любого данного члена, чтобы предотвратить неправильное использование. Мы всегда должны использовать модификатор закрытого доступа, если нет веских причин не делать этого.

Уровень общего доступа следует использовать только в том случае, если член является частью API.

Как всегда, примеры кода доступны на Github.