– Cześć, Amigo! Słyszałem, że Raszi wyjaśnił Ci coś nowego i ekscytującego?!

– Zgadza się, Kim.

– Mój temat będzie równie interesujący. Chcę Ci opowiedzieć o tym, jak ładuje się klasy do pamięci.

Klasy w języku Java to pliki na dysku, zawierające kod bajtowy, który jest skompilowanym kodem Java.

– Tak, pamiętam.

Maszyna Java nie ładuje ich, jeśli nie musi. Gdy tylko gdzieś w kodzie pojawi się odwołanie do jakiejś klasy, maszyna Java sprawdza, czy jest ona załadowana. W przeciwnym razie ładuje ją i inicjalizuje.

Inicjalizacja klasy polega na przypisaniu wartości do wszystkich jej zmiennych statycznych i wywołaniu wszystkich statycznych bloków inicjalizacyjnych.

– To wydaje się podobne do wywoływania konstruktora na obiekcie. Ale co to jest statyczny blok inicjalizacyjny?

– Jeśli musisz wykonać złożony kod (na przykład załadować coś z pliku), aby zainicjalizować obiekty, możemy to zrobić w konstruktorze. Jednakże, zmienne statyczne nie mają takiej możliwości. Ponieważ jednak jest to potrzebne, możesz dodać do klas jeden lub więcej statycznych bloków inicjalizacyjnych. Odpowiadają one w zasadzie konstruktorom statycznym.

Wygląda to tak:

Kod Co się dzieje naprawdę
class Cat
{
public static int catCount = 0 ;
public static String namePrefix;

static
{
Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");
}

public static int maxCatCount = 50;

static
{
Properties p = new Properties();
p.loadFromFile("max.properties");
if (p.get("cat-max") != null)
maxCatCount = p.getInt("cat-max");
}

}


class Cat
{
public static int catCount;
public static String namePrefix;
public static int maxCatCount;

//Statyczne konstruktory nie są dozwolone w Javie,
//ale gdyby były, wszystko
//wyglądałoby tak
public static Cat()
{
catCount = 0;

Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");

maxCatCount = 50;

Properties p2 = new Properties();
p2.loadFromFile("max.properties");
if (p2.get("cat-max")!=null)
maxCatCount = p2.getInt("cat-max");
}
}

To bardzo podobne do tego, co dzieje się w momencie wywołania konstruktora. Zapisałem go nawet jako (nieistniejący) konstruktor statyczny.

Już rozumiem.

– Bardzo dobrze.