Особливості застосування модифікаторів в java

Для початку розберемося з модифікаторами доступу. Їх всього чотири:

  • private члени класу доступні тільки усередині класу
  • package-private або default (за замовчуванням) члени класу видно всередині пакету
  • protected члени класу доступні всередині пакету і в класах-спадкоємців
  • public члени класу доступні всім

Під час успадкування можлива зміна модифікаторів доступу в сторону БІЛЬШОЮ видимості.

Модифікатор доступу у конструкторів, методів і полів може бути будь-який, а ось з класами і їх блоками не так все просто. Клас може бути тільки або public, або default, причому в одному файлі може перебувати тільки один public клас. У блоку може бути тільки один модифікатор - default.

Модифікатори static, abstract і final

  • Застосовується тільки для методів і класів
  • У абстрактних методів немає тіла методу
  • Є протилежністю final: final клас не може успадковуватися, abstract клас зобов'язаний успадковуватися
  • Клас повинен бути оголошений як abstract якщо:
  1. він містить хоча б один абстрактний метод
  2. він не надає реалізацію успадкованих абстрактних методів
  3. він не надає реалізацію методів інтерфейсу, реалізацію якого він оголосив
  4. необхідно заборонити створення екземплярів класу

Модифікатори strictfp, transient, volatile, synchronized, native

  • Застосовується для методів і класів
  • Забезпечує виконання операцій над числами типу float і double (з плаваючою комою) за стандартом IEEE 754
  • Застосовується тільки для змінних рівня класу (локальні змінні не можуть бути оголошені як transient)
  • Transientпеременние можуть не бути final або static.
  • Transientпеременние НЕ серіалізуются
  • Використовується тільки з перемінними
  • Може використовуватися з static змінними
  • Не використовується з final змінними - Значення змінної, оголошеної як volatile, змінене одним потоком, асинхронно змінюється і для інших потоків
  • Застосовується в багатопотокових застосуваннях

Synchronized

  • Застосовується тільки до методів або частинам методів
  • Використовується для контролю доступу до важливим частинами коду в багатопоточних програмах
  • Використовується тільки для методів
  • Позначає, що метод написаний іншою мовою програмування
  • Класи в Java використовують багато native методів для підвищення продуктивності і доступу до апаратних засобів
  • Можна зраджувати / повертати Java об'єкти з native методів
  • Сигнатура методу повинна закінчуватися ";", фігурні дужки викличуть помилку компіляції

Особливості в інтерфейсах

  • Методи завжди public і abstract, навіть якщо це не оголошено
  • Методи не можуть бути static, final, strictfp, native, private, protected
  • Змінні тільки public static final, навіть якщо це не оголошено
  • Змінні не можуть бути strictfp, native, private, protected
  • Може тільки наслідувати (extends) інший інтерфейс, але не реалізовувати інтерфейс або клас (implements).

Зберемо все модифікатори разом: