CodeGym /Kursy Java /Moduł 2: Rdzeń Java /Ładowanie klas, dane statyczne...

Ładowanie klas, dane statyczne...

Moduł 2: Rdzeń Java
Poziom 8 , Lekcja 1
Dostępny

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

Komentarze (1)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Robert Poziom 20, Debica, Poland
23 grudnia 2022
Narrację powinna wykonać kobieta (Kim), na co wskazuje avatar. Jednak narrację tekstu pisanego czarną czcionką wykonuje mężczyzna. Przydałoby się to poprawić.😏