Зміст курсу
Java Extended
Java Extended
Модифікатор Private
Як приховати поля та методи від іншого класу?
Модифікатори доступу використовуються для контролю видимості та доступності змінних і методів у Java. Вони дозволяють визначати область видимості та обмежувати доступ до певних членів класу.
Ми вже розглядали модифікатори доступу у попередньому розділі. Тепер детальніше розглянемо найпоширеніший модифікатор доступу — private
.
Як відомо, за допомогою модифікатора доступу private
ми можемо отримати доступ до поля або методу лише з того класу, в якому вони оголошені. Розглянемо приклад використання модифікатора private
:
Наприклад, якщо ми не хочемо, щоб змінна одного класу була видимою або доступною для іншого класу, можна використати модифікатор доступу private
:
Main.java
package com.example; public class Main { public static void main(String[] args) { Person bob = new Person(); bob.name = "Bob"; System.out.println(bob.name); } } class Person { private String name; private int age; private String gender; }
Ми оголосили поля класу Person
як private
. Коли ми намагаємося безпосередньо ініціалізувати поле, отримуємо помилку, яка вказує, що поле name
має модифікатор доступу private
і недоступне для виклику чи зміни в основному методі.
Як ініціалізувати приватне поле?
Найпростіший спосіб обійти захист — використати ініціалізацію через конструктор. Однак таким чином ми можемо лише ініціалізувати поля об'єктів, але не отримати доступ до цих полів. Розглянемо приклад:
Main.java
package com.example; public class Main { public static void main(String[] args) { Person bob = new Person("Bob"); System.out.println(bob.name); } } class Person { private String name; private int age; private String gender; public Person(String name) { this.name = name; } }
Ми змогли ініціалізувати поле name
через конструктор, але все одно не можемо отримати доступ до цього поля та вивести його за допомогою System.out.println()
. Щоб обійти це, можна перевизначити метод toString()
, щоб при виклику System.out.println(bob);
відображалася інформація про його поля.
Розглянемо приклад:
Main.java
package com.example; public class Main { public static void main(String[] args) { Person bob = new Person("Bob"); System.out.println(bob); } } class Person { private String name; private int age; private String gender; public Person(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } }
Нам нарешті вдалося відобразити значення поля name
об'єкта bob
. Це було досягнуто за допомогою перевизначеного методу toString()
, у якому реалізовано логіку для відображення name
.
Виникає питання: навіщо потрібен цей модифікатор доступу, якщо доводиться писати стільки додаткового коду?
Іноді в різних класах існують змінні з однаковими іменами, і в таких випадках необхідно приховати змінні цих класів, щоб інші класи не мали доступу до зайвих полів. Це значно підвищує зручність написання коду загалом, коли зрозуміло, яке поле належить якому класу.
Дякуємо за ваш відгук!