9. Java – Модифікатори доступу та класу
Модифікатори – ключові слова, які Ви додаєте під час ініціалізації для зміни значень. Мова Java має широкий спектр модифікаторів, основні з них:
- модифікатори доступу;
- модифікатори класу, методу, змінної та потоку, що використовуються не для доступу.
Щоб використовувати модифікатор в Java, потрібно включити його ключове слово визначення класу, методу або змінної. Модифікатор повинен бути попереду решти оператора, як показано в наступних прикладах:
private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] arguments) < // Тіло методу >
Модифікатори доступу
Java надає ряд модифікаторів доступу, щоб задати рівні доступу для класів, змінних, методів та конструкторів. Існує чотири доступи:
- Видимий в пакеті (за замовчуванням і модифікатор не потрібні).
- Видимий лише для класу (private).
- Видимий для всіх (public).
- Видимий для пакета та всіх підкласів (protected).
Модифікатор доступу за промовчанням – без ключового слова
Модифікатор доступу за промовчанням – означає, що ми явно не оголошуємо модифікатор доступу Java для класу, поля, методу і т.д.
Змінна або метод, оголошені без модифікатора контролю доступу, доступні для будь-якого іншого класу в тому ж пакеті. Поля в інтерфейсі явно є public, static, final, а методи в інтерфейсі за умовчанням є public.
приклад
Змінні та методи можуть бути оголошені в Java без будь-яких модифікаторів, як показано в наступному прикладі:
Модифікатор доступу: private
Модифікатор private – методи, змінні та конструктори, які оголошені як private у Java можуть бути доступні лише в межах найоголошенішого класу.
Модифікатор доступу private є найбільшим рівнем доступу. Клас та інтерфейси не можуть бути приватними.
Змінні, оголошені як private, можуть бути доступні поза класом, якщо методи, що отримують їх відкриті (public), присутні в класі (нижче дивіться приклад і пояснення).
Використання модифікатора private в Java є основним способом приховати дані.
приклад
Наступний клас використовує контроль доступу private:
public void setFormat(String format) <this.format = format; >>
Тут змінна format класу Logger є private, тому немає ніякого способу для інших класів, щоб отримати і встановити її значення безпосередньо.
Таким чином, щоб ця змінна була доступна для всього, ми визначили два відкриті (public) методи: getFormat(), який повертає значення format, і setFormat(String)що встановлює її значення.
Модифікатор доступу
Модифікатор - Клас, метод, конструктор, інтерфейс і т.д. оголошені як public можуть бути доступні з будь-якого іншого класу. Тому поля, методи, блоки, оголошені всередині public класу можуть бути доступні з будь-якого класу, що належить до "всесвіту" Java.
Проте, якщо до public класу в іншому пакеті ми намагаємося отримати доступ, то public клас доводиться імпортувати.
Завдяки успадкування класів, Java всі публічні (public) методи і змінні класу успадковуються його підкласами.
приклад
Наступна функція використовує контроль доступу:
Метод main() має бути публічним (public). В іншому випадку він не може бути викликаний за допомогою java-інтерпретатора, щоб запустити клас.
Модифікатор доступу protected
Модифікатор protected – змінні, методи та конструктори, які оголошуються як protected у суперкласі, можуть бути доступні лише для підкласів в іншому пакеті або для будь-якого класу у пакеті класу protected.
Модифікатор доступу protected Java не може бути застосований до класу і інтерфейсів. Методи та поля можуть бути оголошені як protected, однак методи та поля в інтерфейсі не можуть бути оголошені як protected.
Доступ protected дає підкласу можливість використовувати допоміжний метод або змінну, запобігаючи неспорідненому класу від спроб використовувати їх.
приклад
Наступний батьківський клас використовує контроль доступу protected, щоб його дочірній клас перевизначив метод openSpeaker():
> class StreamingAudioPlayer < boolean openSpeaker(Speaker sp) < // деталі реалізації >>
При цьому якщо ми визначимо метод openSpeaker() як protected, то він не буде доступний з будь-якого іншого класу, крім AudioPlayer. Якщо ми визначимо його як public, то він стане доступним усім.
Правила контролю доступу та наслідування
Наступні правила Java застосовуються для успадкованих методів:
- Методи, оголошені як public у суперкласі, також мають бути public у всіх підкласах.
- Методи, оголошені як protected у суперкласі, повинні бути або protected, або public у підкласах вони можуть бути private.
- Методи, оголошені як private для всіх не успадковуються, тому немає жодного правила для них.
Модифікатори класу, методу, змінної та потоку, які використовуються не для доступу
Java надає ряд модифікаторів не для доступу, а для багатьох інших функціональних можливостей:
- модифікатор static застосовується для створення методів та змінних класу;
- модифікатор final використовується для завершення реалізації класів, методів та змінних;
- модифікатор abstract необхідний створення абстрактних класів і методів;
- модифікатори synchronized і volatile використовуються Java для потоків.
Модифікатор static
Модифікатор static – застосовується до створення методів і змінних класу.
Змінні static
Ключове слово static використовується для створення змінних, які будуть існувати незалежно від екземплярів, створених для класу.Тільки одна копія змінної static Java існує незалежно від кількості екземплярів класу.
Статичні змінні також відомі як змінні класу. У Java локальні змінні неможливо знайти оголошені статичними (static).
Методи static
Ключове слово static використовується для створення методів, які існуватимуть незалежно від будь-яких екземплярів, створених для класу.
У Java статичні методи або методи static не використовують будь-які змінні екземпляри будь-якого об'єкта класу, вони визначені. Методи static приймають усі дані з параметрів і щось із цих параметрів обчислюється без посилання змінні.
Змінні та методи класу можуть бути доступні з використанням імені класу, за яким слідує точка та ім'я змінної або методу.
приклад
Модифікатор static Java використовується для створення методів класів і змінних, як показано в наступному прикладі:
private static void addInstance() < numInstances++; >InstanceCounter() < InstanceCounter.addInstance(); >public static void main(String[] arguments) < System.out.println("Починаючи з + InstanceCounter.getCount() + "екземпляра"); for (int i = 0; i < 500; ++i) < new InstanceCounter (); >System.out.println("Створено" + InstanceCounter.getCount() + "примірників"); > >
Буде отримано наступний результат:
Модифікатор final
Модифікатор final – використовується для завершення реалізації класів, методів та змінних.
Змінні final
Змінна final може бути ініціалізована лише один раз. Посилальна змінна, оголошена як final, ніколи не може бути призначена для позначення іншого об'єкта.
Однак, дані всередині об'єкта можуть бути змінені. Таким чином, стан об'єкта може бути змінено, але не посилання.
Зі змінними в Java модифікатор final часто використовується зі static, щоб зробити константою змінну класу.
приклад
Методи final
Метод final може бути перевизначений будь-яким підкласом.Як згадувалося раніше, Java модифікатор final запобігає методу від змін у підкласі.
Головним наміром зробити метод final буде те, що зміст методу не повинен бути змінений стороні.
приклад
Оголошення методу, що використовує модифікатор final оголошення класу, показано в наступному прикладі:
Клас final
Основна мета Java використання класу оголошеного як final полягає в запобіганні клас від бути підкласом. Якщо клас позначається як final, то жоден клас не може успадковувати будь-яку функцію класу final.
приклад
Модифікатор abstract
Модифікатор abstract – використовується для створення абстрактних класів та методів.
Клас abstract
Клас abstract не може створити екземпляр. Якщо клас оголошений як abstract, єдина мета йому бути розширеним.
Клас може бути одночасно abstract і final, оскільки клас final може бути розширеним. Якщо клас містить абстрактні методи, він повинен бути оголошений як abstract. В іншому випадку буде згенеровано помилку компіляції.
Клас abstract може містити як абстрактні методи, так і звичайні.
приклад
Метод abstract
Метод abstract є методом, оголошеним із будь-якою реалізацією. Тіло методу (реалізація) забезпечується підкласом. Методи abstract ніколи не можуть бути final або strict.
Будь-який клас, який розширює абстрактний клас, повинен реалізувати всі абстрактні методи суперкласу, якщо підклас не є абстрактним класом.
Якщо клас Java містить один або кілька абстрактних методів, то клас повинен бути оголошений як abstract. Абстрактний клас не повинен містити абстрактні способи.
Абстрактний метод закінчується крапкою з комою. приклад: public abstract sample();
приклад
class SubClass extends SuperClass < // реалізує абстрактний метод void m()< . >>
Модифікатор synchronized
Модифікатор synchronized - використовуються в Java для потоків.
Ключове слово synchronized використовується для вказівки того, що метод може бути доступний лише одним потоком одночасно. У Java модифікатор synchronized може бути застосований з будь-яким із чотирьох модифікаторів рівня доступу.
приклад
Модифікатор transient
Змінна екземпляра зазначена як transient вказує віртуальній машині Java (JVM), щоб пропустити певну змінну під час серіалізації об'єкта, що містить її.
Цей модифікатор включений до оператора, що створює змінну, попереднього класу або типу даних змінної.
приклад
Модифікатор volatile
Модифікатор volatile - використовуються в Java для потоків.
У Java модифікатор volatile використовується, щоб дозволити знати JVM, що потік доступу до змінної завжди повинен об'єднувати власну копію змінної з головною копією в пам'яті.
Доступ до змінної volatile синхронізує всі скопійовані кешовані змінні в оперативній пам'яті. Volatile може бути застосований тільки до змінних примірників, які мають тип об'єкта або private. Посилання на об'єкт volatile може бути null.
приклад
Як правило, run() викликається в одному потоці (вперше починаєте використовувати Runnable Java), а stop() викликається з іншого потоку. Якщо в лінії 1 використовується кешоване значення active, цикл не може зупинитися, поки Ви не встановите active false в лінії 2.
У наступному уроці обговоримо основні оператори, які у мові Java. Цей розділ дасть Вам огляд того, як їх можна використовувати під час розробки програми.
Зміст
- 1. Java - Самовчитель для початківців
- 2. Java – Огляд мови
- 3. Java – Встановлення та налаштування
- 4. Java – Синтаксис
- 5. Java – Класи та об'єкти
- 6. Java – Конструктори
- 7. Java – Типи даних та літерали
- 8. Java - Типи змінних
- 9. Java – Модифікатори
- 10. Java – Оператори
- 11. Java – Цикли та оператори циклу
- 11.1. Java – Цикл while
- 11.2. Java – Цикл for
- 11.3. Java – Поліпшений цикл for
- 11.4. Java – Цикл do..while
- 11.5. Java – Оператор break
- 11.6.Java – Оператор continue
- 12. Java - Оператори прийняття рішень
- 12.1. Java – Оператор if
- 12.2. Java – Оператор if..else
- 12.3. Java – Вкладений оператор if
- 12.4. Java – Оператор switch..case
- 12.5. Java – Умовний оператор (?:)
- 13. Java – Числа
- 13.1. Java – Методи byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
- 13.2. Java – Метод compareTo()
- 13.3. Java – Метод equals()
- 13.4. Java – Метод valueOf()
- 13.5. Java – Метод toString()
- 13.6. Java – Метод parseInt()
- 13.7. Java – Метод Math.abs()
- 13.8. Java – Метод Math.ceil()
- 13.9. Java – Метод Math.floor()
- 13.10. Java - Метод Math.rint()
- 13.11. Java – Метод Math.round()
- 13.12. Java – Метод Math.min()
- 13.13. Java – Метод Math.max()
- 13.14. Java – Метод Math.exp()
- 13.15. Java – Метод Math.log()
- 13.16. Java – Метод Math.pow()
- 13.17. Java – Метод Math.sqrt()
- 13.18. Java – Метод Math.sin()
- 13.19. Java – Метод Math.cos()
- 13.20. Java – Метод Math.tan()
- 13.21. Java – Метод Math.asin()
- 13.22. Java – Метод Math.acos()
- 13.23. Java – Метод Math.atan()
- 13.24. Java – Метод Math.atan2()
- 13.25. Java – Метод Math.toDegrees()
- 13.26. Java – Метод Math.toRadians()
- 13.27. Java – Метод Math.random()
- 14. Java – Символи
- 14.1. Java – Метод Character.isLetter()
- 14.2. Java – Метод Character.isDigit()
- 14.3. Java – Метод Character.isWhitespace()
- 14.4. Java – Метод Character.isUpperCase()
- 14.5. Java – Метод Character.isLowerCase()
- 14.6. Java – Метод Character.toUpperCase()
- 14.7. Java – Метод Character.toLowerCase()
- 14.8. Java – Метод Character.toString()
- 15. Java – Рядки
- 15.1. Java – Метод charAt()
- 15.2. Java – Метод compareTo()
- 15.3. Java – Метод compareToIgnoreCase()
- 15.4. Java – Метод concat()
- 15.5. Java – Метод contentEquals()
- 15.6. Java – Метод copyValueOf()
- 15.7. Java – Метод endsWith()
- 15.8. Java – Метод equals()
- 15.9. Java - Метод equalsIgnoreCase()
- 15.10. Java – Метод getBytes()
- 15.11. Java – Метод getChars()
- 15.12. Java – Метод hashCode()
- 15.13.Java - Метод indexOf()
- 15.14. Java – Метод intern()
- 15.15. Java - Метод lastIndexOf()
- 15.16. Java – Метод length()
- 15.17. Java – Метод matches()
- 15.18. Java – Метод regionMatches()
- 15.19. Java – Метод replace()
- 15.20. Java – Метод replaceAll()
- 15.21. Java – Метод replaceFirst()
- 15.22. Java – Метод split()
- 15.23. Java – Метод startsWith()
- 15.24. Java – Метод subSequence()
- 15.25. Java – Метод substring()
- 15.26. Java – Метод toCharArray()
- 15.27. Java – Метод toLowerCase()
- 15.28. Java – Метод toString()
- 15.29. Java – Метод toUpperCase()
- 15.30. Java – Метод trim()
- 15.31. Java – Метод valueOf()
- 15.32. Java – Класи StringBuilder та StringBuffer
- 15.32.1. Java – Метод append()
- 15.32.2. Java – Метод reverse()
- 15.32.3. Java – Метод delete()
- 15.32.4. Java – Метод insert()
- 15.32.5. Java – Метод replace()
- 16. Java – Масиви
- 17. Java – Дата та час
- 18. Java - Регулярні вирази
- 19. Java - Методи
- 20. Java – Потоки вводу/виводу, файли та каталоги
- 20.1. Java – Клас ByteArrayInputStream
- 20.2. Java – Клас DataInputStream
- 20.3. Java – Клас ByteArrayOutputStream
- 20.4. Java – Клас DataOutputStream
- 20.5. Java – Клас File
- 20.6. Java – Клас FileReader
- 20.7. Java – Клас FileWriter
- 21. Java – Винятки
- 21.1. Java – Вбудовані винятки
- 22. Java – Вкладені та внутрішні класи
- 23. Java – Спадкування
- 24. Java - Перевизначення
- 25. Java – Поліморфізм
- 26. Java – Абстракція
- 27. Java - Інкапсуляція
- 28. Java – Інтерфейси
- 29. Java – Пакети
- 30. Java - Структури даних
- 30.1. Java – Інтерфейс Enumeration
- 30.2. Java – Клас BitSet
- 30.3. Java – Клас Vector
- 30.4. Java – Клас Stack
- 30.5. Java – Клас Dictionary
- 30.6. Java – Клас Hashtable
- 30.7. Java – Клас Properties
- 31. Java – Колекції
- 31.1. Java – Інтерфейс Collection
- 31.2. Java – Інтерфейс List
- 31.3. Java – Інтерфейс Set
- 31.4. Java – Інтерфейс SortedSet
- 31.5. Java – Інтерфейс Map
- 31.6. Java – Інтерфейс Map.Entry
- 31.7. Java – Інтерфейс SortedMap
- 31.8.Java – Клас LinkedList
- 31.9. Java – Клас ArrayList
- 31.10. Java – Клас HashSet
- 31.11. Java – Клас LinkedHashSet
- 31.12. Java – Клас TreeSet
- 31.13. Java – Клас HashMap
- 31.14. Java – Клас TreeMap
- 31.15. Java – Клас WeakHashMap
- 31.16. Java – Клас LinkedHashMap
- 31.17. Java – Клас IdentityHashMap
- 31.18. Java – Алгоритми Collection
- 31.19. Java – Iterator та ListIterator
- 31.20. Java – Comparator
- 32. Java – Дженерики
- 33. Java – Серіалізація
- 34. Java – Мережа
- 34.1. Java – Обробка URL
- 35. Java – Надсилання Email
- 36. Java - Багатопоточність
- 36.1. Java – Синхронізація потоків
- 36.2. Java – Міжпоточний зв'язок
- 36.3. Java – Взаємне блокування потоків
- 36.4. Java – Керування потоками
- 37. Java – Основи роботи з аплетами
- 38. Java – Javadoc
Модифікатори доступу до Java
У цьому посібнику ми розглянемо модифікатори доступу Java, які використовуються для встановлення рівня доступу до класів, змінних, методів і конструкторів.
Простіше кажучи, є чотири модифікатори доступу: public, private, protected і default (без ключового слова).
Перш ніж ми почнемо, відзначимо, що клас верхнього рівня може використовувати лише модифікатори доступу public або default. На рівні члена ми можемо використати усі чотири.
2. За замовчуванням
Коли ми не використовуємо будь-яке ключове слово явно, Java встановить стандартний доступ до даного класу, методу або властивості. Модифікатор доступу за замовчуванням також називається package-private , що означає, що всі елементи видно в одному пакеті, але недоступні з інших пакетів:
package
com.foreach.accessmodifiers;
public
class
SuperPublic
static
void
defaultMethod()
...
>
>
defaultMethod() доступний в іншому класі того ж пакета:
package
com.foreach.accessmodifiers;
public
class
Public
public
Public()
SuperPublic.defaultMethod();
// Available in the same package.
>
>
Однак, він недоступний в інших пакетах.
3. Громадський
Якщо ми додамо ключове слово public до класу, методу чи властивості , ми зробимо його доступним для всього світу , тобто. решта класів у всіх пакетах зможуть його використовувати. Це найменш обмежуючий модифікатор доступу:
package
com.foreach.accessmodifiers;
public
class
SuperPublic
public
static
void
publicMethod()
...
>
>
publicMethod() доступний в іншому пакеті:
package
com.foreach.accessmodifiers.another;
import
com.foreach.accessmodifiers.SuperPublic;
public
class
AnotherPublic
public
AnotherPublic()
SuperPublic.publicMethod();
// Available everywhere. Let's note different package.
>
>
Докладніше про те, як поводиться ключове слово public при застосуванні до класу, інтерфейсу, вкладеного публічного класу або інтерфейсу та методу, див. у спеціальній статті.
4. Приватне
Будь-який метод, властивість чи конструктор із ключовим словом private доступний тільки з того ж класу . Це найбільший модифікатор доступу, який є основою концепції інкапсуляції. Всі дані будуть приховані від зовнішнього світу:
package
com.foreach.accessmodifiers;
public
class
SuperPublic
static
private
void
privateMethod()
...
>
private
void
anotherPrivateMethod()
privateMethod();
// available in the same class only.
>
>
У цій докладнішій статті показано, як ключове слово private поводиться при застосуванні до поля, конструктора, методу та внутрішнього класу.
5. Захищено
Між загальнодоступним та приватним рівнями доступу є модифікатор захищеного доступу.
Якщо ми оголосимо метод, властивість або конструктор з ключовим словом protected , ми зможемо отримати доступ до члена з того ж пакета (як і при рівні доступу package-private ) також з усіх підкласів його класу навіть якщо вони лежать в інших пакетах:
package
com.foreach.accessmodifiers;
public
class
SuperPublic
static
protected
void
protectedMethod()
...
>
>
protectedMethod() доступний у підкласах (незалежно від пакета):
package
com.foreach.accessmodifiers.another;
import
com.foreach.accessmodifiers.SuperPublic;
public
class
AnotherSubClass
extends
SuperPublic
public
AnotherSubClass()
SuperPublic.protectedMethod();
// Available in subclass. Let's note different package.
>
>
У спеціальній статті докладніше описується ключове слово під час використання у полі, методі, конструкторі, внутрішньому класі та доступності у тому чи іншому пакеті.
6. Порівняння
У таблиці нижче наведено доступні модифікатори доступу. Ми бачимо, що клас, незалежно від модифікаторів доступу, що використовуються, завжди має доступ до своїх членів:
| Модифікатор | Навчальний клас Упакування | Підклас | Світ |
|
Які модифікатори доступу бувають у класів?
Усі члени класу у мові Java – поля та методи – мають модифікатори доступу. У минулих темах ми вже стикалися з модифікатором public. Модифікатори доступу дозволяють задати допустиму область видимості для членів класу, тобто контекст, у якому можна використовувати цю змінну чи спосіб.
У Java використовуються такі модифікатори доступу:
- public: публічний, загальнодоступний клас або член класу. Поля та методи, оголошені з модифікатором public, видно іншим класам із поточного пакету та із зовнішніх пакетів.
- private: закритий клас або член класу, протилежність модифікатору public. Закритий клас або член класу доступний лише з коду того ж класу.
- protected : такий клас або член класу доступний з будь-якого місця в поточному класі або пакеті або похідних класах, навіть якщо вони знаходяться в інших пакетах
- Модифікатор за промовчанням. Відсутність модифікатора поля чи методу класу передбачає застосування до нього модифікатора за умовчанням. Такі поля чи методи видно всім класам у поточному пакеті.
Розглянемо модифікатори доступу на прикладі наступної програми:
Public class Program < public static void main(String[] args) < Person kate = new Person("Kate", 32, "Baker Street", "+12334567"); kate.displayName(); // норм, метод public kate.displayAge(); // норм, метод має модифікатор за промовчанням kate.displayPhone(); // норм, метод protected //kate.displayAddress(); //! Помилка метод private System.out.println(kate.name); // норм, модифікатор за промовчанням System.out.println(kate.address); // норм, модифікатор public System.out.println(kate.age); // норм, модифікатор protected // System.out.println (kate.phone); //! Помилка, модифікатор private >> class Person < String name; protected int age; public String address; private String phone; Public Person(String name, int age, String address, String phone)< this.name = name; this.age = age; this.address = address; this.phone = phone; >public void displayName() < System.out.printf("Name: %s \n", name); >void displayAge() < System.out.printf("Age: %d \n", age); >private void displayAddress() < System.out.printf("Address: %s \n", address); >protected void displayPhone()< System.out.printf("Phone: %s \n", phone); >>
В даному випадку обидва класи розташовані в одному пакеті - пакеті за замовчуванням, тому в класі Program ми можемо використовувати всі методи та змінні класу Person, які мають модифікатор за замовчуванням, public і protected. А поля та методи з модифікатором private у класі Program не будуть доступні.
Якби клас Program розташовувався в іншому пакеті, йому були доступні лише поля і методи з модифікатором public.
Модифікатор доступу повинен передувати решті визначення змінної або методу.
Інкапсуляція
Здавалося б, чому б не оголосити всі змінні та методи з модифікатором public , щоб вони були доступні в будь-якій точці програми незалежно від пакета чи класу? Візьмемо, наприклад, поле age, яке становить вік.Якщо інший клас має прямий доступ до цього поля, то є ймовірність, що в процесі роботи програми йому буде передано некоректне значення, наприклад, негативне число. Подібна зміна даних не є бажаною. Або ми хочемо, щоб деякі дані були доступні безпосередньо, щоб їх можна було вивести на консоль або просто дізнатися їх значення. У зв'язку з цим рекомендується якнайбільше обмежувати доступ до даних, щоб захистити їх від небажаного доступу ззовні (як для отримання значення, так і для його зміни). Використання різних модифікаторів гарантує, що дані не будуть перекручені або змінені неправильно. Подібне приховування даних усередині певної області видимості називається інкапсуляцією.
Так, зазвичай, замість безпосереднього застосування полів використовують методи доступу. Наприклад:
public class Program < public static void main(String[] args) < Person kate = new Person("Kate", 30); System.out.println(kate.getAge()); // 30 kate.setAge(33); System.out.println(kate.getAge()); // 33 kate.setAge(123450); System.out.println(kate.getAge()); // 33 >> class Person < private String name; private int age = 1; public Person(String name, int age)<setName(name); setAge(age); >public String getName() < return this.name; >public void setName(String name) < this.name = name; >public int getAge() < return this.age; >public void setAge(int age) < if(age >0 && age < 110) this.age = age; >>
І потім замість безпосередньої роботи з полями name та age у класі Person ми будемо працювати з методами, які встановлюють та повертають значення цих полів. Методи setName, setAge і подібні ще називають м'ютейтерами (mutator), оскільки вони змінюють значення поля. А методи getName, getAge і на кшталт називають аксесерами (accessor), оскільки з допомогою ми отримуємо значення поля.
Причому ці методи ми можемо вкласти додаткову логіку.Наприклад, у разі зміни віку проводиться перевірка, наскільки відповідає нове значення допустимому діапазону.
