3. Jawne inicjacje
Jak pamiętamy, pola klasy mają zagwarantowaną inicjację na wartości
ZERO (0, false - dla typu boolean, null - dla referencji, co oznacza referencję
"pustą", nie odnosząca się do żadnego obiektu).
Np. gdybyśmy mieli taką klasę Para:
class Para {
int a;
int b;
void show() {...}
}
to do jej definicji dodany zostałby automatycznie pusty konstruktor bezparametrowy:
Para() { }
i przy odwołaniu
Para p = new Para();
wartości pól zostałyby ustalone na (0, 0).
Wartości pól są inicjowane przed wywołaniem konstruktora. Zatem gdybyśmy w klasie Para zdefiniowali konstruktor:
Para() {
a--;
b--;
}
to odwołanie new Para() nadalo by składnikom pary wartości (-1, -1).
Oprócz korzystania z domyślnych inicjacji można posłużyć się jawną inicjacją przy deklaracji pól.
Np. w kontekście:
class Para {
int a = 1;
int b = 1;
Para() {
a++;
b++;
}
}
po wywołaniu new Para(), wartości składników pray byłyby (2, 2).
Przy inicjacji pól można posługiwac się wyrażeniami np. przy:
Statyczna metoda max z klasy Math zwraca maksimum z podanych argumentów
class Para {
int a = 2;
int b = Math.max(a, 1) + a + 1;
Para() { }
}
new Para() stworzy obiekt z elementami 2, 5
Inicjacja pól niestatycznych dokonuje się przed wywołaniem konstruktora
i odbywa się w kolejności definicji tych pól w klasie
Warto też wiedzieć, że przy każdym pierwszym odwołaniu do klasy (czy to przy użyciu odwołania do składowej statycznej czy za pomoca wyrażenia new) najpierw
inicjowane są pola statyczne (które też mogą mieć inicjatory), a inicjacja
ta odbywa się w kolejności deklaracji pól statycznych w klasie. Jeżeli przy
tym mamy do czynienia z tworzeniem obiektu, to w następnej kolejności inicjowane
są pola niestatyczne (w kolejności deklaracji) i na końcu wykonywany konstruktor.
Najczęściej jednak do inicjacji pól klasy używa się przede wszystkim odpowiednio
zdefiniowanych konstruktorów, zaś jawne inicjacje są stosowane w nie budzących
wątpliwości przypadkach np. w omawianej poprzednio klasie Disk, moglibyśmy
zapisać:
class Disk {
static double vat = 22.0;
...
}
i w programie testowym nie musieć wywoływac metody statycznej ustalającej stawkę vat (Disk.setVat(22.0)).
|