Модификаторы доступа в языке Java
Объектно-ориентированное программирование позволяет повторять структуру реальных объектов — их внутреннее и внешнее строение, функционал. Для примера возьмем смартфон. У него есть функции, которые доступны для человека (интерфейс, включение, выключение и т. п).
Есть функции, которые не доступны человеку — электронные процессы, связь, передача данных — они скрыты от доступа, но управляются через интерфейс. Для передачи данных человек не может открыть корпус и что-то сделать с платой — нужно нажать на кнопку интерфейса и запустится функция, закрытая для рук пользователя.
Что такое модификаторы доступа и зачем они нужны?
Модификаторы доступа — специальные зарезервированные слова, которые ограничивают область видимости полей, констант, методов и классов. Модификаторы доступа позволяют ограничить доступ пользователя к отдельным полям и методам объекта. В программировании это еще называется инкапсуляцией.
Какие бывают модификаторы доступа?
Модификаторы доступа бывают внутренние и внешние. Внутренние используют внутри класса для методов, констант и полей. Внешние модификаторы используют для самого класса.
Внешние модификаторы:
- public;
- abstract;
- finall.
Внутренние модификаторы:
- public;
- private;
- protected;
- static.
Теперь рассмотрим их детальнее.
Внешние модификаторы
Каждый внешний модификатор ограничивает или расширяет возможности класса:
Public. Класс доступный отовсюду. Класс может наследовать свой функционал другим классам. Если класс объявлен без этого модификатора, доступен только в том пакете, где он объявлен. К примеру, это главный файл программы с методом main.
Abstract. В классах с таким модификатором описываются только имена полей, имена методов и сигнатура. Функционал методов и значения полей реализуются только в классах наследниках. Такой класс не может создавать объекты и не имеет конструктора. Он лишь предоставляет базовый функционал для остальных классов. При этом, поля могут иметь разные значения, а операторы метода у каждого класса индивидуальные.
Finall. Данный модификатор запрещает классу наследовать функционал другим классам. Этот класс индивидуален и не распространяет свои поля и методы наследникам. При попытке наследовать от класса finall приведет к ошибке компиляции.
Пример:
class Hello{} // Класс без модификатора доступен только в рамках пакета. Обычно объявляются в файле с функцией main
public class Hello_public{} // класс который доступен отовсюду
public abstract class Hello_abstract{} // класс, который наследует свои методы и поля другим классам. Его методы только определены, но не имеют операторов. Он не имеет конструктора и не может создавать объекты.
public finall class Hello_final{} // класс которые не может наследовать.
Внутренние модификаторы
Каждый модификатор ограничивает область видимости поля или метода:
- Public. Метод может быть вызван другими методами класса, а также доступен во внешнем коде.
- Private. Метод может быть вызван только другими методами класса, но не напрямую через объект.
- Protected. Метод или поле доступно только в текущем пакете. Вызывается объектами классов, объявленных только в текущем пакете. НЕ может быть вызванным объектами классов из импортируемых пакетов.
- По умолчанию. Метод или поле без модификатора. Такие методы и поля могут использоваться в текущем пакете.
- Static. Поле или метод вызывается не через объект, а через имя класса.
Пример:
class Example{
public int a = 1;
private int b = 2;
protected int c = 3;
int d = 4;
static int e = 5;public Example(){} // пустой конструктор
public void show(x){ // метод для отображения полей
System.out.print(x);
add(); // приватный метод может быть вызван только внутри другого метода или в конструкторе
}private void add(){
a++;
}static void message(){
System.out.print(«Static»);
}
}Example obj = new Example();
System.out.print(obj.a); // 1
System.out.print(obj.b); // ошибка — приватное поле не может использоваться через объект
System.out.print(obj.c); // 3
System.out.print(obj.d); // 4
System.out.print(obj.e); // ошибка
System.out.print(Example.e); // 5//методы
obj.show(b); // 2 — protected поле доступно внутри методов объекта
System.out.print(obj.a); //2 — был вызван приватный метод предыдущем и a увеличилась на 1Example.message(); // static — вызов статического метода
Статический инициализатор
В классах кроме полей и методов можно объявить статический инициализатор. Он выполняет функцию метода, но запускается автоматически перед вызовом самого первого конструктора в классе.
Пример:
class Cherry{
private int name;
static int sort;static{
sort = red_cherry;
System.out.println(«Red_cherry initialized»);
}
Cherry(){
name = «Cherry»;
System.out.println(«Constructor»);
}Cherry item = new Cherry();
// в консоль будет выведено:
Red_cherry initialized
Constructor
Получается, что при вызове конструктора, сначала вызывается инициализатор, а затем конструктор. При последующих вызовах конструктора инициализатор не будет вызываться и сохранит текущее значение статического поля.
Итог
Модификаторы доступа как внутренние, так и внешние предназначены для организации функциональности объектов. Приватные функции недоступны для внешнего управления, публичные реализуют внешний интерфейс и могут вызывать приватные функции. Такая организация классов и объектов позволяет максимально приближенно подойти к созданию объектов реального мира.