2012-04-16 14 views
6

Sto navigando attraverso la sorgente Android, solo tipo di lettura, e mi sono imbattuto in una strana porzione di codice in Android.Util.JsonReader. E 'come segue:Scope Java peculiare

private final List<JsonScope> stack = new ArrayList<JsonScope>(); 
{ 
    push(JsonScope.EMPTY_DOCUMENT); 
} 

Cos'è questo fare esattamente? Cioè, l'ambito immediatamente successivo all'assegnazione new? Se capisco correttamente, ogni volta che questa classe, JsonReader viene istanziata, (non statica, vero?), stack verrà inizializzato qui, piuttosto che tramite un this.stack = ... nel costruttore, corretto?

Che cosa fa allora l'ambito? È eseguito dopo lo stack viene inizializzato? Sono solo un po 'confuso qui, per quanto riguarda il nome di questo modello e il suo uso.

risposta

5

Non correlato alla nuova dichiarazione. È un inizializzatore, un po 'come un costruttore senza parametri senza nome.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6

Vengono eseguiti prima che i costruttori di una classe in ordine testuale

http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5

+0

Che poi fa scattare? Possono essere più diversi, presumibilmente dopo diversi campi di classe? – Josh

+0

Grazie, questi sono ottimi collegamenti. Una domanda però, perché appare subito dopo quel particolare campo? E 'solo specifico per questa classe? Ci sono ~ 6 campi che seguono 'stack', prima del costruttore della classe, e circa della stessa quantità che lo precede. – Josh

+2

Suppongo che sia lì solo perché manipola il campo dello stack tramite la chiamata push. –