Z See Java Static Variable Methods :
- Jest to zmienna należąca do klasy, a nie do obiektu (instancji)
- Zmienne statyczne są inicjowane tylko raz, na początku wykonywania. Te zmienne zostaną zainicjalizowane jako pierwsze, przed inicjalizacją jakichkolwiek zmiennych instancji
- Pojedyncza kopia do współużytkowania przez wszystkie instancje klasy
- Dostęp do zmiennej statycznej można uzyskać bezpośrednio poprzez nazwę klasy i nie wymaga ona żadnego obiektu.
Zmienne instancji i klasy (statyczne) są automatycznie inicjowane do standardowych wartości domyślnych, jeśli nie uda się ich celowo zainicjować. Chociaż zmienne lokalne nie są inicjowane automatycznie, nie można skompilować programu, który nie może zainicjować zmiennej lokalnej ani przypisać wartości do tej zmiennej lokalnej przed jej użyciem.
Kompilator w rzeczywistości tworzy wewnętrzną procedurę inicjalizacji pojedynczej klasy, która łączy wszystkie statyczne inicjatory zmiennych i wszystkie statyczne bloki inicjatora kodu, w kolejności, w jakiej pojawiają się w deklaracji klasy. Ta pojedyncza procedura inicjalizacji jest uruchamiana automatycznie, tylko jeden raz, podczas pierwszego ładowania klasy.
W przypadku klas wewnętrznych nie mogą mieć pól statycznych
Wewnętrzna klasa to klasa zagnieżdżona, który nie jest bezpośrednio lub pośrednio zadeklarowane static
.
...
Klasy wewnętrzne nie mogą deklarować statycznych inicjatorów (§8.7) ani interfejsów składowych ...
Klasy wewnętrzne nie mogą deklarować statycznych elementów członkowskich, chyba że są zmiennymi stałymi ...
Zobacz JLS 8.1.3 Klasy wewnętrzne i instancje zamykające
final
pola w Javie mogą być inicjowane niezależnie od miejsca ich deklaracji, jednak nie może to mieć zastosowania do static final
pól. Zobacz poniższy przykład.
final class Demo
{
private final int x;
private static final int z;
static
{
z = 10;
}
public Demo(int x)
{
this.x=x;
}
}
To dlatego, że istnieje tylko jedna kopia ze static
zmiennych związanych z typem, zamiast jednego związanego z każdej instancji typem ze zmiennych instancji, a jeśli staramy się zainicjować z
typu static final
wewnątrz konstruktora, będzie próbował ponownie zainicjować static final
pole typu z
ponieważ konstruktor jest uruchamiany na każdej instancji klasy, która nie może wystąpić w final
polach statycznych .