2013-02-25 4 views
9

Ho provato a cercare questa domanda tramite il motore di ricerca, ma ho trovato un argomento che spiegava la differenza tra l'inizializzazione di una classe e l'istanziazione di un oggetto.Differenza tra l'inizializzazione di una classe e l'istanziazione di un oggetto?

Qualcuno potrebbe spiegare come si differenziano?

+5

Non c'è nulla come inizializzare una classe. Intendi l'inizializzazione di una variabile? – Femaref

+0

intendi ** inizializza un oggetto ** ?? – PermGenError

+0

@Femaref, forse il termine non è tecnico, ma penso che sia corretto descrivere inizializzatori e costruttori statici come inizializzando rispettivamente una classe e un'istanza. –

risposta

1

Quando una classe Java viene "caricata" nella JVM, la rappresentazione della classe deve essere inizializzata in diversi modi.

  • Il "pool costante" della classe viene espanso in una struttura di runtime e alcuni valori in esso vengono inizializzati.
  • La superclasse della classe si trova (tramite il pool costante) e gli attributi di essa estratti.
  • Una tabella di metodo viene costruita per i metodi della classe. I singoli metodi sono contrassegnati come "non ancora verificati".
  • Diverse operazioni di verifica vengono eseguite sulla rappresentazione di classe.
  • I campi statici sono inizializzati.
  • Al primo riferimento, i valori letterali stringa sono "internati" e il puntatore stringa internato viene inserito nel pool costante
  • I primi metodi di riferimento sono "verificati".
  • Et al.

Esiste un set specifico di terminologia utilizzato per fare riferimento all'inizializzazione della classe, sebbene non ricordi le specifiche. Alcune cose possono verificarsi solo dopo che una classe è stata inizializzata su un punto specifico, ecc.

L'istanziazione di un oggetto può avvenire solo dopo che la classe è stata caricata e inizializzata (sebbene non sia necessario verificare tutti i metodi). La dimensione dell'oggetto è ricavata dalla classe e tale heap è localizzato e azzerato. L'intestazione dell'oggetto viene riempita con un puntatore alla classe e altri campi utilizzati per gestire la classe. Quindi viene invocato il metodo di costruzione appropriato per la classe (e invocherà il costruttore di super).

0

L'inizializzazione di una classe viene eseguita utilizzando un blocco di inizializzazione statico. (statico {}). Non è un metodo, è un inizializzatore. Viene eseguito la prima volta che la classe stessa viene referenziata.

L'istanziazione di un oggetto viene eseguita ad esempio con una nuova parola chiave chiamando il suo costruttore. A quel punto il blocco di inizializzazione statico non verrà eseguito.

14

Ci sono tre termini di terminologia associati a questo argomento: dichiarazione, inizializzazione e istanziazione.

Lavoro dal retro in avanti.

istanze

Questo è quando la memoria si alloca per un oggetto. Questo è ciò che sta facendo la parola chiave new. Un riferimento all'oggetto che è stato creato viene restituito dalla parola chiave new.

inizializzazione

Questo è quando i valori sono inseriti nella memoria allocata. Questo è ciò che fa il Constructor di una classe quando si utilizza la parola chiave new.

Una variabile deve anche essere inizializzata avendo il riferimento a qualche oggetto in memoria passato ad esso.

Dichiarazione

Questo è quando si statali per il programma che ci sarà un oggetto di un certo tipo esistente e che il nome di quell'oggetto sarà.

Esempio di inizializzazione e di istanze sulla stessa linea

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

Esempio di inizializzazione di una variabile su una linea diversa di memoria

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

avrei anche vivamente lettura this article sulla natura di come Java gestisce le variabili in transito.

+1

Puoi dare un esempio dove inizializzazione e istanziazione non si verificano nello stesso momento? – Leo

+0

@Leo Ho aggiornato il post ... fammi sapere se questo ha aiutato! – lachy

+0

dove ** "s" ** viene istanziato (quando viene assegnata la memoria)? –

Problemi correlati