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

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 увеличилась на 1

Example.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

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

Итог

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

Оцените статью
Образовательный портал WELCOME4U.RU
Добавить комментарий

Adblock
detector