З Див. Методи статичної змінної 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полів.