Перейти к содержанию

Модификаторы доступа в Java

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

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

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

Default

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

package ru.javamaster.accessmodifiers;

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

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

package ru.javamaster.accessmodifiers;

public class Public {
    public Public() {
        SuperPublic.defaultMethod(); // Доступен в том же пакете.
    }
}

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

Public

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

package ru.javamaster.accessmodifiers;

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

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

package ru.javamaster.accessmodifiers.another;

import ru.javamaster.accessmodifiers.SuperPublic;

public class AnotherPublic {
    public AnotherPublic() {
        SuperPublic.publicMethod(); // Доступно везде.
    }
}

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

Private

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

package ru.javamaster.accessmodifiers;

public class SuperPublic {
    static private void privateMethod() {
        ...
    }
    
     private void anotherPrivateMethod() {
         privateMethod(); // Доступен только в том же классе.
    }
}

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

Protected

Между уровнями доступа public и private находится модификатор доступа protected.

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

package ru.javamaster.accessmodifiers;

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

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

package ru.javamaster.accessmodifiers.another;

import ru.javamaster.accessmodifiers.SuperPublic;

public class AnotherSubClass extends SuperPublic {
    public AnotherSubClass() {
        SuperPublic.protectedMethod(); // Доступен в подклассе.
    }
}

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

Сравнение

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

МодификаторКлассПакетПодклассВезде
public++++
protected+++
default++
private+

Заключение

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

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

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

Примеры кода доступны на Github.

Оригинал