2016-02-05 4 views
6

Voglio solo sapere perché Object, String ecc. Hanno un blocco statico {} alla fine.che è l'uso del blocco statico nella classe dell'oggetto.Perché la classe Object ha un blocco statico?

Aprire il prompt cmd e digitare

javap java.lang.Object 

enter image description here

+4

La prego di sostituire l'immagine con il testo effettivo del codice in questione? –

+2

Questo è solo un inizializzatore statico, in pratica ... –

+0

@MUSTKEEMMANSURI L'hai appena chiesto nella tua domanda. Non è necessario pubblicare un commento che dice la stessa cosa. –

risposta

10

Quello che state guardando è solo tutte le dichiarazioni di metodo e di campo. Poiché il blocco statico è un po 'come un metodo, vedrai semplicemente la dichiarazione vuota di un initalizer statico.

Se si guarda alla OpenJDK source code per java.lang.Object sulla linea 40, il codice in realtà dice che questo

public class Object { 

    private static native void registerNatives(); 
    static { 
     registerNatives(); 
    } 

Una semplice spiegazione del blocco statico è che il blocco unico viene chiamato volta, no importa quanti oggetti del tipo crei.


Se volete maggiori informazioni dalla riga di comando, javap -verbose java.lang.Object uscite questa

static {}; 
    descriptor:()V 
    flags: ACC_STATIC 
    Code: 
     stack=0, locals=0, args_size=0 
     0: invokestatic #16     // Method registerNatives:()V 
     3: return 
     LineNumberTable: 
     line 41: 0 
     line 42: 3 
} 

Oppure, meno prolissa javap -c java.lang.Object

static {}; 
    Code: 
     0: invokestatic #16     // Method registerNatives:()V 
     3: return 

Se si desidera leggere riguardo a cosa registerNatives(), puoi leggere questo post.

What does the registerNatives() method do?

+0

Credo che questo dovrebbe essere aggiunto alla descrizione del comando javap. Doc dice "Quando non si usano le opzioni, il comando javap stampa il pacchetto, i campi protetti e pubblici e i metodi delle classi passati ad esso, il comando javap stampa il suo output su stdout." http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javap.html o sono impliciti in uno degli articoli sopra? –

+0

@ShireResident: credo che un blocco statico sia definito dall'ambito pacchetto-privato. (Poiché non è presente alcun modificatore pubblico/privato/protetto su di esso) –

+0

Mi sono concentrato in particolare sui "campi" e sui "metodi". Non pensavo che il blocco statico fosse considerato uno di quelli. –