З Див. Методи статичної змінної Java :
- Це змінна, яка належить до класу, а не до об'єкта (екземпляра)
- Статичні змінні ініціалізуються лише один раз, на початку виконання. Ці змінні будуть ініціалізовані спочатку, перед ініціалізацією будь-яких змінних екземпляра
- Одна копія, якою мають користуватися всі екземпляри класу
- До статичної змінної можна отримати прямий доступ за назвою класу і не потребує жодного об’єкта.
Змінні екземпляра та класу (статичні) автоматично ініціалізуються до стандартних значень за замовчуванням, якщо не вдається їх спеціально ініціалізувати. Незважаючи на те, що локальні змінні не ініціалізуються автоматично, ви не можете скомпілювати програму, яка не зможе ні ініціалізувати локальну змінну, ні призначити значення цій локальній змінній до того, як вона буде використана.
Те, що насправді робить компілятор, - це створити внутрішню процедуру ініціалізації класу, яка поєднує в собі всі ініціалізатори статичної змінної та всі блоки статичного ініціалізатора коду в тому порядку, в якому вони з’являються в оголошенні класу. Ця одна процедура ініціалізації запускається автоматично, лише один раз, при першому завантаженні класу.
У випадку внутрішніх класів вони не можуть мати статичних полів
Внутрішній клас є вкладеним класом , який не відкрито або неявно оголошується static
.
...
Внутрішні класи не можуть оголошувати статичні ініціалізатори (§8.7) або інтерфейси-члени ...
Внутрішні класи не можуть оголошувати статичні члени, якщо вони не є постійними змінними ...
Див. JLS 8.1.3 Внутрішні класи та екземпляри, що включають
final
поля в Java можна ініціалізувати окремо від місця їх декларації, однак це не може бути застосовано до static final
полів. Дивіться приклад нижче.
final class Demo
{
private final int x;
private static final int z;
static
{
z = 10;
}
public Demo(int x)
{
this.x=x;
}
}
Це відбувається тому , що є тільки одна копія з static
змінних , пов'язаних з типом, а не один , пов'язаним з кожним екземпляром типу , як зі змінним екземпляром і якщо ми спробуємо форматувати z
тип static final
в конструкторі, він буде намагатися повторно форматувати static final
поле типу z
оскільки конструктор запускається при кожному екземплярі класу, який не повинен відбуватися для статичних final
полів.