2013-02-25 15 views
9

Próbowałem wyszukać to pytanie za pośrednictwem wyszukiwarki, ale mogłem znaleźć temat wyjaśniający różnicę między inicjowaniem klasy a instancją obiektu.Różnica między inicjowaniem klasy a instancją obiektu?

Czy ktoś mógłby wyjaśnić, jak się różnią?

+5

Nie ma czegoś takiego jak inicjowanie zajęć. Masz na myśli inicjowanie zmiennej? – Femaref

+0

masz na myśli ** zainicjować obiekt ** ?? – PermGenError

+0

@Femaref, być może określenie to nie jest techniczne, ale myślę, że uczciwie jest opisać statyczne inicjatory i konstruktory jako inicjujące odpowiednio klasę i instancję. –

Odpowiedz

1

Po załadowaniu klasy Java do JVM reprezentacja klas musi zostać zainicjowana na kilka sposobów.

  • "Pula stałych" klasy zostaje rozwinięta do struktury środowiska wykonawczego, a niektóre wartości są inicjowane.
  • Nadklasę klasy znajduje się (poprzez pulę stałą) i jej atrybuty wyodrębnione.
  • Sporządzono tabelę metod dla metod klasy. Poszczególne metody są oznaczone jako "jeszcze niezweryfikowane".
  • Wykonano kilka operacji weryfikacji na reprezentacji klas.
  • Pola statyczne zostały zainicjalizowane.
  • W pierwszym odwołaniu literały łańcuchowe są "internowane", a internowany wskaźnik łańcuchowy jest umieszczony w puli stałej
  • Na pierwszych metodach odniesienia są "zweryfikowane".
  • Et al.

Istnieje określony zestaw terminów używanych w odniesieniu do inicjowania klasy, choć nie pamiętam szczegółów. Pewne rzeczy mogą wystąpić dopiero po zainicjowaniu klasy w określonym punkcie, itp.

Tworzenie instancji obiektu może nastąpić dopiero po załadowaniu i zainicjowaniu klasy (mimo że nie wszystkie metody muszą zostać zweryfikowane). Rozmiar obiektu jest pobierany z klasy i tyle sterty znajduje się i wyzerowuje. Nagłówek obiektu jest wypełniany wskaźnikiem do klasy i innych pól używanych do zarządzania klasą. Następnie wywoływana jest odpowiednia metoda konstruktora dla klasy (i wywoła ona dowolny konstruktor super).

0

Inicjowanie klasy odbywa się za pomocą statycznego bloku inicjalizacji. (static {}). To nie jest metoda, to inicjator. Jest wykonywany po pierwszym nawiązaniu do samej klasy.

Tworzenie instancji obiektu odbywa się na przykład za pomocą nowego słowa kluczowego, wywołując jego konstruktor. W tym czasie blok inicjalizacji statycznej nie zostanie wykonany.

14

Istnieją trzy elementy terminologii związane z tym tematem: deklaracja, inicjalizacja i tworzenie instancji.

Praca od tyłu do przodu.

Tworzenie instancji

To kiedy pamięć jest przydzielona dla obiektu. To właśnie robi słowo kluczowe new. Odwołanie do obiektu, który został utworzony, jest zwracane ze słowa kluczowego new.

Inicjowanie

To wtedy wartości są wprowadzane do pamięci, która została przydzielona. To właśnie robi Constructor klasy podczas używania słowa kluczowego new.

Zmienna musi również zostać zainicjalizowana przez odniesienie do jakiegoś obiektu w pamięci przekazanej do niego.

Deklaracja

to jest, kiedy stwierdza się, że program nie będzie przedmiotem pewnego typu istniejących i jaka jest nazwa tego obiektu zostanie.

Przykład inicjalizacji a instancje tej samej linii

SomeClass s; // Declaration 
s = new SomeClass(); // Instantiates and initializes the memory and initializes the variable 's' 

Przykład Inicjalizacja zmiennych w innej linii w pamięci

void someFunction(SomeClass other) { 
    SomeClass s; // Declaration 
    s = other; // Initializes the variable 's' but memory for variable other was set somewhere else 
} 

że również bardzo zalecane odczytu this article na temat tego, jak Java radzi sobie z przekazywaniem zmiennych.

+1

Czy możesz podać przykład, w którym inicjalizacja i tworzenie wystąpień _nie_ zdarzają się w tym samym czasie? – Leo

+0

@Leo Zaktualizowałem wpis ... daj mi znać, jeśli to pomogło! – lachy

+0

gdzie ** "s" ** jest uzyskiwanie instancji (kiedy czy przydzielana jest jej pamięć)? –

Powiązane problemy