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. Заключение
Уровни доступа влияют на нас двумя способами.
- Во-первых, когда вы используете классы, полученные из другого источника, уровни доступа определяют, какие элементы этих классов могут использовать ваши собственные классы.
- Во-вторых, при написании класса вы должны решить, какой уровень доступа должна иметь каждая переменная-член и каждый метод в вашем классе.
Если другие программисты используют ваш класс, вы хотите быть уверены, что ошибки от неправильного использования не могут произойти. Уровни доступа могут помочь вам в этом.