2013-07-17 7 views
9

Czy ktoś mógłby wyjaśnić, jaka jest różnica między ładowaniem klasy a tworzeniem instancji klasy. Kiedy ładujemy klasę ze zmienną statyczną, czy ona również otrzymuje instancję w tym samym czasie, kiedy klasa zostaje załadowana? Po tym wszystkim, że cały statyczny kod jest częścią klasy, a nie poszczególnych instancji. Byłoby pomocne, gdyby ktoś podał przykład, który pomógłby mi lepiej to zrozumieć.Różnica między ładowaniem klasy a jej instancją

+0

może stanowić alternatywę ma miejsce Stack Exchange Network [ta odpowiedź] (http://programmers.stackexchange.com/questions/53181/what-is-the-difference-between-instantiating- i-loading-a-class-in-java). Jest zbyt szeroki. – NINCOMPOOP

+5

@TheNewIdiot Nie sądzę, że pytanie jest szerokie, ponieważ ma bardzo konkretny zakres, a także konkretną odpowiedź. –

+0

SO również definiuje ** szeroki ** ponieważ * dobre odpowiedzi byłyby zbyt długie dla tego formatu. * !!! – NINCOMPOOP

Odpowiedz

9

Oto niektóre ładne wyjaśnienie (z przykładu i obserwacji)

When a class is loaded and initialized in JVM - Java

Kiedy klasa jest ładowany w Javie

Klasa ładowanie odbywa się poprzez ClassLoaders w Javie, które mogą zostać wprowadzone do chętnie ładuj klasę, gdy tylko inna klasa ją odwoła lub leniwy załaduje klasę, dopóki nie pojawi się potrzeba inicjalizacji klasy. Jeśli klasa zostanie wczytana przed faktycznym jej użyciem, może zostać w środku przed inicjalizacją. Wierzę, że może się to różnić od JVM do JVM. Gwarantowana przez JLS, że klasa zostanie załadowana, gdy zachodzi potrzeba statycznej inicjalizacji.

Kiedy klasa jest inicjowany w Javie

Kiedy klasa jest inicjowany w Javie Po klasy załadunku, inicjalizacji klasy odbywa się co oznacza inicjowanie statyczne wszystkich członków klasy. Klasa jest inicjowany w Javie, gdy:

1) instancją klasy jest tworzony przy użyciu new() słowa kluczowego lub użyciu odbicia przy użyciu Class.forName(), która może rzucić ClassNotFoundException w Javie.

2) wywoływana jest statyczna metoda klasy.

3) przypisano pole statyczne klasy .

4) używane jest statyczne pole klasy, które nie jest zmienną stałą .

5) jeśli klasa jest klasą najwyższego poziomu, a stwierdzenie leksykalne zagnieżdżone w klasie jest wykonywane.

Nadzieję, że pomaga.

+0

Jestem trochę zdezorientowany i chcę wyjaśnić ci coś z tobą. przez leniwy ładunek mamy na myśli to, że nawet gdy classloader widzi deklarację klasy wewnątrz bieżącej klasy, to nie ładuje drugiej klasy, ponieważ nie jest jeszcze zainicjalizowana i podczas gdy chętny ładowanie klasy ładuje wszystkie klasy, które widzi bez względu na to, czy jest inicjowane czy też nie i może również wyjaśnić, w jaki sposób zarówno leniwi, jak i chętni do ładowania klas odpowiadają na wywołania rekursywne (ładują inne klasy, które napotykają). – light

3

Klasa loading
Ilekroć JVM określa potrzebuje klasę (aby wykorzystać swoje zmienne statyczne, aby utworzyć nowy obiekt, aby wykorzystać swoje metody statyczne itp) będzie załadować klasy i statyczne bloki inicjalizacji zostanie uruchomiony, zmienne statyczne są inicjalizowane itp.to (co najmniej w normalnych okolicznościach) tylko raz

SomeClass.someStaticMethod(); //SomeClass is loaded (if its not already) 
SomeClass.someStaticVariable; //SomeClass is loaded (if its not already) 
SomeClass var=new SomeClass(); //SomeClass is BOTH loaded (if its not already) AND instantiated 

wyniku następujące przebiegi (jako przykład):

static Vector3d var=new Vector3d(); //static variables are initialised 

static{ 
    //static initialisation block are run 
} 

instancji klasy
Z drugiej podaję ci instantiate a class kiedy tworzysz instancję klasy ze słowem kluczowym new; tworzenie instancji klasy tworzy obiekt klasy.

SomeClass var=new SomeClass(); //SomeClass is instantiating (and loaded if its not already) 

wskutek biegnie Konstruktor:

public SomeClass(){ 
} 

i

{ 
    //initialisation block(s) also run (but these are very uncommonly used) 
} 
6
Integer.toString(123); 

Dla powyższego statyczne wywołanie metody pracy, klasa Integer musi być załadowany.

Integer i = new Integer(123); 

A w powyższym kodzie I utworzeniu instancji (obiektu) klasy Integer (które również muszą być załadowane do tego, aby pracować, oczywiście).

Niektóre klasy nie mają być tworzone (np. Klasa Math, która ma tylko statyczne metody).

+0

+1 To jest najkrótsza, ale najlepsza odpowiedź, poprawne użycie przykładu, to właśnie tu pojawia się doświadczenie! – NINCOMPOOP

2

Klasa jest ładowana, gdy jest przywoływana (np. Przez Class.forName()).

Obiekt jest instancyjny, tworząc instancję, np.

Object o = new Object(); 

Możesz także zainicjować obiekt za pomocą refleksji.

static elementy klasy są prezentowane po załadowaniu klasy, np.

public class Sample { 
    private static int variable = 10; 
} 

Kiedy teraz ładunek klasy (na przykład przez Class.forName("Sample");) Następnie zmienna variable jest inicjowany do wartości 10.

Jeśli tworzysz nową instancję klasy i nie jest ona ładowana, zanim klasa zostanie wczytana (atomatycznie). Tak więc konstrukcja Class.forName() jest potrzebna tylko w szczególnych okolicznościach (jeśli klasa nie jest znana na podstawie czasu kompilacji np.).

+0

+1 za wyczerpujące wyjaśnienie bez zamieszczania linków. – NINCOMPOOP

+1

@TheNewIdiot Czy publikowanie łączy złe rzeczy? Z pewnością odpowiedź powinna być w stanie "żyć bez" linków, ale odniesienie dodaje wiarygodności do odpowiedzi –

+0

@RichardTingle Przepraszam, ale chciałem powiedzieć ** tylko linki odpowiedzi ** bez wyjaśnienia. – NINCOMPOOP

3

Program ładujący klasy faktycznie ładuje kod bajtowy do JVM, uruchamia inicjalizatory statyczne.Gdy chcesz używać pól statycznych w klasie bez tworzenia jego instancji, klasa musi być ładowana przez moduł ładujący klasy.Domyślny ładownik klasy w języku Java to java.lang.ClassLoader. Ta klasa ładowanie odbywa się tylko raz.
Podczas tworzenia klasy instancji klasy w pamięci. Możemy utworzyć instancję klasy przy użyciu new. Tworzenie instancji można wykonać tyle razy. np Animal a=new Animal();

More on class loading

+0

Mówisz, że program ładujący klasy uruchamia inicjatory statyczne i ładowanie odbywa się dokładnie raz, a następnie co się stanie, gdy instancja klasy zmieni wartość zmiennej statycznej? –

+0

Gdy program ładujący klasy napotka słowo kluczowe klasy, sprawdzi, czy klasa jest już załadowana. Jeśli zmienna statyczna zostanie zainicjowana po wczytaniu klasy, zmiany wprowadzone do niej przez klasę zostaną odzwierciedlone podczas tworzenia nowej instancji klasy. – Rohan

+0

Może nie jestem jasne. Pytam, powiedzmy, że stworzyłem instancję (obiekt) klasy. używając tej instancji zmieniam wartość zmiennej statycznej. Jak ta zmiana zostanie odzwierciedlona w załadowanej klasie? –

Powiązane problemy