# 1. `public` — Доступен везде

java 5 / 11
3 min read
Table of Contents

Понимание модификаторов видимости в Java: Полное руководство

В Java управление доступом к классам, методам и полям осуществляется через модификаторы видимости. Эти модификаторы играют ключевую роль в реализации принципа инкапсуляции, одного из столпов объектно-ориентированного программирования. Они определяют, какие части кода могут взаимодействовать с другими компонентами, обеспечивая безопасность и структурированность программы. Рассмотрим четыре модификатора видимости: public, private, protected и package-private (по умолчанию).


1. public — Доступен везде

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

Пример:

// Класс в пакете com.example
package com.example;
public class PublicDemo {
public String message = "Hello, World!";
public void printMessage() {
System.out.println(message);
}
}
// Класс в другом пакете
package com.test;
import com.example.PublicDemo;
public class Test {
public static void main(String[] args) {
PublicDemo demo = new PublicDemo();
System.out.println(demo.message); // Доступ к public-полю
demo.printMessage(); // Вызов public-метода
}
}

Где используется:

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

2. private — Доступ только внутри класса

Модификатор private ограничивает видимость элементов рамками класса. Такие элементы недоступны даже в подклассах или классах того же пакета.

Пример:

public class PrivateDemo {
private int secretCode = 123;
private void showCode() {
System.out.println("Code: " + secretCode);
}
public void accessPrivate() {
showCode(); // Доступ внутри класса разрешен
}
}
class Test {
public static void main(String[] args) {
PrivateDemo demo = new PrivateDemo();
// demo.secretCode; // Ошибка: private-поле недоступно
// demo.showCode(); // Ошибка: private-метод недоступен
demo.accessPrivate(); // Вызов публичного метода, который использует private-элементы
}
}

Где используется:

  • Для полей класса, чтобы предотвратить прямое изменение извне.
  • Для вспомогательных методов, используемых внутри класса.

3. protected — Доступ в пакете и подклассах

Модификатор protected позволяет обращаться к элементам:

  • Внутри того же пакета.
  • В подклассах, даже если они находятся в другом пакете.

Пример:

// Пакет com.parent
package com.parent;
public class Parent {
protected void inheritMe() {
System.out.println("This method is inherited.");
}
}
// Пакет com.child
package com.child;
import com.parent.Parent;
public class Child extends Parent {
void test() {
inheritMe(); // Доступ через наследование
Parent parent = new Parent();
// parent.inheritMe(); // Ошибка: доступ через экземпляр родителя запрещен
}
}

Где используется:

  • Для методов и полей, которые должны быть доступны подклассам, но скрыты от остального кода.

4. Package-Private (по умолчанию) — Доступ в пределах пакета

Если модификатор не указан, элемент считается package-private. Он доступен только внутри своего пакета.

Пример:

// Пакет com.utils
package com.utils;
class Logger {
void log(String message) { // Метод без модификатора (package-private)
System.out.println(message);
}
}
// Другой класс в том же пакете
package com.utils;
public class App {
public static void main(String[] args) {
Logger logger = new Logger();
logger.log("Test"); // Доступ разрешен
}
}
// Класс в другом пакете
package com.test;
import com.utils.Logger;
public class Test {
public static void main(String[] args) {
// Logger logger = new Logger(); // Ошибка: класс Logger невидим
// logger.log("Test"); // Недоступно
}
}

Где используется:

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

Сравнение модификаторов видимости

МодификаторКлассПакетПодклассыОстальной мир
privateДаНетНетНет
package-privateДаДаНетНет
protectedДаДаДаНет
publicДаДаДаДа

Лучшие практики

  1. Инкапсуляция: Всегда объявляйте поля как private, предоставляя доступ через геттеры/сеттеры.
  2. Минимальная видимость: Используйте самый строгий модификатор. Например, для внутренних методов — private или package-private.
  3. public API: Делайте публичными только те методы, которые должны быть частью интерфейса класса.
  4. Наследование: Для методов, которые могут переопределяться в подклассах, используйте protected.

Частые ошибки

  • Использование public для полей: Это нарушает инкапсуляцию. Поля должны быть private с контролируемым доступом.
  • Путаница с protected: Запомните, что подклассы в других пакетах могут обращаться к protected-элементам только через наследование, но не через экземпляр родительского класса.
  • Неявный package-private: Не забывайте, что отсутствие модификатора делает элемент доступным только в пакете.

Заключение

Понимание модификаторов видимости — основа написания безопасного и поддерживаемого кода на Java. Они позволяют контролировать взаимодействие между компонентами системы, уменьшая риск ошибок и упрощая рефакторинг. Всегда начинайте с максимально строгого модификатора (private), расширяя видимость только при необходимости.

Next: Что такое java.lang?
Аватар автора

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


java Series

# Java

java 1 / 11
5 min read

Java java-core Understand OOP concepts Know language syntax and constructions Understand visibility modifiers, exception handling Be aware of java.lang.classes Optional class New Date/Time API New…

Read

# Что такое Java Core?

java 2 / 11
3 min read

Java Core: Основы самого популярного языка программирования Java — один из самых востребованных языков программирования в мире, и его сердцем является Java Core — набор базовых концепций, библиотек и…

Read

# 1. Инкапсуляция

java 3 / 11
3 min read

Java: Понимание основных концепций объектно-ориентированного программирования (ООП) Объектно-ориентированное программирование (ООП) — это парадигма, которая использует объекты и классы для…

Read

# 1. Основы синтаксиса

java 4 / 11
3 min read

Java: Знание синтаксиса и основных конструкций языка Java — один из самых популярных языков программирования, известный своей кроссплатформенностью, объектно-ориентированной природой и широким…

Read

# 1. `public` — Доступен везде

java 5 / 11
3 min read

Понимание модификаторов видимости в Java: Полное руководство В Java управление доступом к классам, методам и полям осуществляется через модификаторы видимости. Эти модификаторы играют ключевую роль в…

Continue

# Что такое java.lang?

java 6 / 11
3 min read

Java: Будьте внимательны с классами пакета java.lang Java — язык программирования, известный своей стабильностью и богатой стандартной библиотекой. Особое место в ней занимает пакет , который…

Read

# Method References в Java: Полное руководство

java 11 / 11
3 min read

Введение С выходом Java 8 появились мощные инструменты для работы с функциональным программированием: лямбда-выражения, функциональные интерфейсы и Stream API. Одним из ключевых нововведений стали…

Read