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

Java предоставляет четыре модификатора доступа для установки уровней доступа для классов, переменных, методов и конструкторов, т.е. public, private, protected и default. Эти модификаторы уровня доступа определяют, могут ли другие классы использовать определенное поле или вызывать определенный метод.

1. Модификаторы доступа

Давайте кратко сравним эти модификаторы доступа.

  • общедоступный – доступен везде
  • защищенный – доступен в том же пакете и подклассах за пределами пакета
  • по умолчанию – доступно только в том же пакете
  • частный – доступен только в том же классе

Спецификаторы доступа можно упорядочить по степени их строгости, как показано ниже. Публичный — наименее строгий, а частный — наиболее строгий.

публичный > защищенный > пакет-частный(или по умолчанию) > частный

1.1. публичный

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

public class Data {private String format;public String getFormat() {return this.format;}public void setFormat(String format) {this.format = format;}}

В приведенном выше примере методы getFormat() и setFormat() являются открытыми, поэтому к ним можно получить доступ из любого класса.

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

1.2. защищенный

Защищенные члены доступны классам того же пакета и подклассам за пределами пакета.

public class Data {protected void displayMessage(){System.out.println("Test message");}}

В классе Data метод displayMessage() объявлен защищенным, поэтому к нему могут получить доступ все классы, присутствующие в том же пакете, где присутствует HelloWorld.java, а также дочерние классы, присутствующие в других пакетах.

 публичный класс Main {public static void main(String[] args) {Данные данные = новые Данные();данные.displayMessage();}}

Если мы попытаемся получить доступ к displayMessage() в другом пакете без расширения класса Data, мы получим следующую ошибку компиляции:

'displayMessage()' has protected access in 'com.howtodoinjava.core.basic.accessModifiers.package1.Data'
Модификатор защищенного доступа

Когда мы наследуем класс Data, мы можем получить доступ к displayMessage() за пределами текущего пакета.

public class Main extends Data {public static void main(String[] args) {Main main = new Main();main.displayMessage();}}

1.3. по умолчанию

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

Давайте удалим защищенный доступ из displayMessage() в классе Data. Это изменит доступ на default.

public class Data {void displayMessage(){System.out.println("Default Test message");}}

Теперь при попытке доступа к displayMessage() в дочернем классе вне пакета мы начнем получать ошибку компиляции:

'displayMessage()' is not public in 'com.howtodoinjava.core.basic.accessModifiers.package1.Data'. Cannot be accessed from outside package
модификатор доступа по умолчанию

1.4. частный

Модификатор доступа private — это самый ограничивающий уровень доступа. Самые верхние классы и интерфейсы не могут быть private. Private-члены доступны только в пределах одного класса. Private-методы, переменные и конструкторы доступны только в пределах самого объявленного класса.

Мы снова модифицируем предыдущий пример, изменив доступ по умолчанию на закрытый доступ для метода displayMessage().

public class Data {private void displayMessage(){System.out.println("Default Test message");}}

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

2. Уровни контроля доступа

Существует два уровня контроля доступа.

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

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

Как private, так и protected могут применяться(и часто применяются) к вложенным классам и интерфейсам, но никогда к классам и интерфейсам верхнего уровня.

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

Уровни доступа влияют на нас двумя способами.

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

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

Прокрутить вверх