2013-07-17 24 views
9

Qualcuno potrebbe spiegare qual è la differenza tra il caricamento della classe e l'istanziazione di una classe. Quando cariciamo una classe con variabile statica, viene anche istanziata nello stesso momento in cui viene caricata la classe? Dopo tutto il codice statico fa parte della classe piuttosto che le singole istanze. Sarebbe utile se qualcuno fornisse un esempio per aiutarmi a capirlo meglio.Differenza tra caricare una classe e istanziarla

+0

può essere un sito alternativo StackExchange ha [questa risposta] (http://programmers.stackexchange.com/questions/53181/what-is-the-difference-between-instantiating- e-caricamento-a-class-in-java). È troppo ampio – NINCOMPOOP

+5

@TheNewIdiot Non penso che la domanda sia ampia poiché ha uno scopo molto specifico e anche una risposta specifica. –

+0

SO definisce anche ** ampio ** come * le risposte positive sarebbero troppo lunghe per questo formato. * !!! – NINCOMPOOP

risposta

9

Ecco qualche bella spiegazione (con un esempio e di osservazione)

When a class is loaded and initialized in JVM - Java

quando la classe viene caricato in Java

Classe di carico è fatto da ClassLoader in Java che possono essere implementate per caricare avidamente una classe non appena un'altra classe fa riferimento a essa o caricare la classe lentamente finché non si verifica l'esigenza di inizializzazione della classe. Se la classe viene caricata prima di essere effettivamente utilizzata, può sedersi all'interno prima di essere inizializzata. Credo che questo possa variare da JVM a JVM. Mentre è garantito da JLS che una classe verrà caricata quando c'è bisogno di inizializzazione statica.

Quando una classe viene inizializzato in Java

Quando una classe viene inizializzato in Java Dopo classe di carico, l'inizializzazione di classe avviene che significa inizializzare tutti i membri statici della classe. Una classe viene inizializzato in Java quando: si crea

1) un'istanza della classe utilizzando nuovo) parola chiave o (utilizzando la riflessione utilizzando Class.forName(), che può gettare ClassNotFoundException in Java.

2) viene richiamato un metodo statico di Classe.

3) viene assegnato un campo statico di Classe .

4) viene utilizzato un campo statico di classe che non è una variabile costante .

5) se Class è una classe di livello superiore e un'asserzione asseritamente lessicata all'interno della classe viene eseguita.

Spero che questo aiuti.

+0

sono un po 'confuso e voglio chiarire qualcosa con te. con caricamento lento intendiamo che anche quando classloader vede una dichiarazione di classe all'interno della classe corrente, non carica l'altra classe poiché non è ancora inizializzata e mentre carica caricando il classloader carica ogni classe che vede, indipendentemente dall'inizializzazione o meno e può anche spiegare come fanno i classloader pigri e desiderosi a gestire le chiamate ricorsive (caricano altre classi che incontrano). – light

3

Classe carico
Ogni volta che la JVM determina ha bisogno di una classe (per usare le sue variabili statiche, per creare un nuovo oggetto, di utilizzare i suoi metodi statici, ecc) che caricherà i blocchi di inizializzazione di classe e statiche verrà eseguito, le variabili statiche sono inizializzate ecc.Questo è (almeno in circostanze normali) fatto solo una volta

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 

Come risultato le seguenti piste (come esempio):

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

static{ 
    //static initialisation block are run 
} 

un'istanza di una classe
D'altra consegna instantiate a class quando si crea un'istanza della classe con la parola chiave new; creare un'istanza di una classe sta creando un oggetto della classe.

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

Di conseguenza le corse del costruttore:

public SomeClass(){ 
} 

e

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

Per la chiamata di metodo statico superiore al lavoro, la classe Integer devono essere caricati.

Integer i = new Integer(123); 

E nel codice di cui sopra, ho creato un'istanza (oggetto) della classe Integer (che deve anche essere caricato per far funzionare tutto questo, ovviamente).

Alcune classi non sono pensate per essere istanziate (come la classe Math, ad esempio, che ha solo metodi statici).

+0

+1 Questa è la risposta più breve ma migliore, l'uso corretto dell'esempio, è qui che entra in gioco l'esperienza! – NINCOMPOOP

2

Una classe viene caricata quando viene referenziata (ad esempio da Class.forName()).

Si instanciate un oggetto creando un'istanza, ad es.

Object o = new Object(); 

È inoltre possibile installare un oggetto utilizzando la riflessione.

static i membri di una classe vengono instanciati quando la classe viene caricata, ad es.

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

Quando ora carico la classe (ad esempio mediante Class.forName("Sample");) Quindi la variabile variable viene inizializzato con il valore 10.

Se si sta creando una nuova istanza di una classe e non viene caricata prima che la classe venga eseguita prima (atomaticamente). Pertanto, il costrutto Class.forName() è necessario solo in circostanze particolari (se la classe non è nota per tempo di compilazione, ad esempio).

+0

+1 per la spiegazione completa senza postare collegamenti. – NINCOMPOOP

+1

@TheNewIdiot Pubblicare link è una brutta cosa? Certamente una risposta dovrebbe essere in grado di "vivere senza" collegamenti, ma un riferimento aggiunge credibilità ad una risposta –

+0

@RichardTingle Scusate, ma volevo dire ** solo link risposta ** senza spiegazione. – NINCOMPOOP

3

Il caricatore di classe carica effettivamente il codice di byte in JVM, esegue gli inizializzatori statici. Quando si desidera utilizzare campi statici all'interno della classe senza creare un'istanza, caricare prima la classe caricatore di classi. Il classloader predefinito in java è java.lang.ClassLoader. il caricamento viene eseguito una sola volta.
Mentre la creazione di classi crea istanza di classe in memoria. È possibile creare un'istanza di classe utilizzando new. L'istanza di classe può essere eseguita tutte le volte. esempio: Animal a=new Animal();

More on class loading

+0

Stai dicendo che il caricatore di classi esegue gli inizializzatori statici e il caricamento viene eseguito esattamente una volta, quindi cosa succede quando un'istanza della classe modifica il valore della variabile statica? –

+0

Quando il programma di caricamento della classe incontra la parola chiave class, controllerà se la classe è già caricata o meno. Poiché la variabile statica viene inizializzata quando viene caricata la classe, le modifiche apportate alla classe verranno riflesse quando si crea una nuova istanza di classe. – Rohan

+0

Forse non sono chiaro. Sto chiedendo diciamo che ho creato un'istanza (oggetto) di una classe. usando questa istanza cambio il valore della variabile statica. In che modo questo cambiamento si riflette nella classe caricata? –

Problemi correlati