« poprzedni punkt  następny punkt »

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)).


« poprzedni punkt  następny punkt »