Witam mam takie pytanko:
Jeśli tworzymy obiekt to czy kopiowane są metody jak i pola do niego z klasy która uprzednio została załadowana przez ClassLoadera ?
Z góry dzieki za pomoc.
Witam mam takie pytanko:
Jeśli tworzymy obiekt to czy kopiowane są metody jak i pola do niego z klasy która uprzednio została załadowana przez ClassLoadera ?
Z góry dzieki za pomoc.
Klasa nie zawiera "pól" tylko ich definicje, więc nie ma ich skąd "kopiować". Utworzenie obiektu tworzy nowy obiekt z polami określonymi przez klasę. Metody to inna bajka, bo ich kod jest załadowany tylko raz a w twoim obiekcie jest tylko informacja gdzie te metody są w pamięci.
@gacus007: trochę inaczej to działa :) W trakcie ładowania klasy przez ClassLoader
tworzony jest specjalny obiekt Class
(w uproszczeniu, bo tak idzie cały graf), który będzie przechowywany w osobnym miejscu w pamięci (gdzie dokładnie to zależy od wersji języka). Następnie jak tworzysz obiekt, to maszyna wirtualna odwołuje się do obiektu typu Class
i dołącza informacje o klasie do utworzonego obiektu. Następnie gdy wywołujesz metodę, albo odwołujesz się do pola, to informacja o tym polu/metodzie jest odczytywana z definicji klasy i aplikowana do obiektu na którym operujesz.
Obiekt jako taki, nie posiada żadnych informacji o metodach czy polach, a jedynie referencję, do obiektu Class
, który reprezentuje typ i ma wszystkie te informacje.
@Koziołek Jesli np jakies pola sa Od razu zainicjowane w klasie i odwolujemy sie do nich w obiekcie, to pobierana jest ich definicja tzn typ, wartosc inicjalizacyjna I tworzane sa w obiekcie ?
Definicja, a wartość to dwie osobne dziedziny. Jeżeli masz coś takiego:
class Klasa{
int i = 10;
Object o = new Object();
}
To jak wywołasz konstruktor, to najpierw zostanie odczytana definicja Klasa
, potem zarezerwowane miejsce na obiekt typu Klasa
, bo wiemy ile miejsca potrzeba, bo mamy informację o zależnościach. Następnie zostaną zainicjowane pola, czyli utworzone obiekty/przypisane wartości prymitywne. I dopiero teraz masz w obiekcie Klasa
podpięte wskaźnik do o
i wartość i
.
Do typów obiektowych zawsze masz wskaźnik (referencję), a do typów prymitywnych wartość.
@Koziołek: Dzieki wielkie, rozwiales moje watpliwosci.