Обзор уровней доступа
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 10 из 87.
Модификаторы доступа управляют тем, откуда можно получить доступ к полям и методам. В Java существует четыре уровня управления доступом.
| Модификатор | Тот же класс | Тот же пакет | Подкласс | Везде |
|---|---|---|---|---|
private | Да | Нет | Нет | Нет |
| по умолчанию (без ключевого слова) | Да | Да | Нет | Нет |
protected | Да | Да | Да | Нет |
public | Да | Да | Да | Да |
public class BankAccount {
private double balance; // Только этот класс
String accountType; // По умолчанию: только тот же пакет
protected String owner; // Тот же пакет + подклассы
public String bankName; // Доступно везде
}private — самый ограничивающий модификатор; используйте его для внутренних данных, к которым никогда не следует обращаться напрямую. public — самый открытый; используйте его для методов, которые должны вызывать другие классы.
Когда вы не указываете никакой модификатор, Java использует доступ default (также называемый package-private). Это разрешает доступ только внутри того же пакета.
class Helper { // Класс с доступом по умолчанию
void assist() { } // Метод с доступом по умолчанию
}Выбирайте наиболее строгий уровень доступа, который при этом позволяет вашему коду работать. Это защищает ваши данные и упрощает поддержку кода.
Задание
ЛегкоДавайте создадим систему записей Student, которая демонстрирует, как модификаторы доступа управляют видимостью в разных файлах.
Вы создадите два файла для организации вашего кода:
Student.java: Определите класс Student с полями, использующими разные уровни доступа:privateполе:studentId(String) - доступно только внутри класса Student- default (без модификатора) поле:
grade(int) - доступно внутри того же пакета protectedполе:name(String) - доступно в том же пакете и в подклассахpublicполе:school(String) - доступно везде
publicметод с именемgetInfo(), который возвращает строку в формате:"[studentId] name - Grade grade at school"Main.java: Создайте объект Student и продемонстрируйте, к каким полям можно обращаться напрямую извне класса. Выведите полеschoolнапрямую, затем выведите результат методаgetInfo(), чтобы показать всю информацию о студенте.
Вы получите четыре входных значения: studentId, name, grade и school (именно в таком порядке).
Ваш вывод должен состоять из двух строк: название школы, полученное напрямую, и полная информация о студенте из метода getInfo().
Шпаргалка
Модификаторы доступа управляют тем, откуда можно получить доступ к полям и методам. В Java существует четыре уровня управления доступом:
| Модификатор | Тот же класс | Тот же пакет | Подкласс | Везде |
|---|---|---|---|---|
private | Да | Нет | Нет | Нет |
| default (без ключевого слова) | Да | Да | Нет | Нет |
protected | Да | Да | Да | Нет |
public | Да | Да | Да | Да |
public class BankAccount {
private double balance; // Только этот класс
String accountType; // По умолчанию: только тот же пакет
protected String owner; // Тот же пакет + подклассы
public String bankName; // Доступно везде
}private является наиболее строгим — используйте его для внутренних данных, к которым никогда не следует обращаться напрямую. public является наиболее открытым — используйте его для методов, которые должны вызывать другие классы.
Если вы не указываете никакой модификатор, Java использует доступ по умолчанию default (также называемый package-private), который разрешает доступ только внутри того же пакета:
class Helper { // Класс с доступом по умолчанию
void assist() { } // Метод с доступом по умолчанию
}Выбирайте наиболее строгий уровень доступа, который при этом позволяет вашему коду работать. Это защищает ваши данные и упрощает поддержку кода.
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Чтение входных данных
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int grade = Integer.parseInt(scanner.nextLine());
String school = scanner.nextLine();
// TODO: Создайте объект Student с входными значениями
// TODO: Выведите поле school напрямую (доступно, так как оно public)
// TODO: Выведите результат getInfo(), чтобы показать всю информацию о студенте
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»