Перейти к основному содержимому

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

· 4 мин. чтения

1. Обзор

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

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

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

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

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

package com.foreach.accessmodifiers;

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

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

package com.foreach.accessmodifiers;

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

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

3. Публичный

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

package com.foreach.accessmodifiers;

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

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

package com.foreach.accessmodifiers.another;

import com.foreach.accessmodifiers.SuperPublic;

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

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

4. Частное

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

package com.foreach.accessmodifiers;

public class SuperPublic {
static private void privateMethod() {
...
}

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

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

5. Защищено

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

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

package com.foreach.accessmodifiers;

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

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

package com.foreach.accessmodifiers.another;

import com.foreach.accessmodifiers.SuperPublic;

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

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

6. Сравнение

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

   | Модификатор    | Учебный класс    | Упаковка    | Подкласс    | Мир   | 
|

публичный

  | Д    | Д    | Д    | Д   | 
|

защищенный

  | Д    | Д    | Д    | Н   | 
|

дефолт

  | Д    | Д    | Н    | Н   | 
|

частный

  | Д    | Н    | Н    | Н   | 

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

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

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

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

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