2015-07-10 8 views

risposta

10

Un campo static final è implementato come costante di compilazione che viene replicata nel metodo/classe di accesso senza alcun riferimento al contesto di definizione (la sua classe). Questo è il motivo per cui l'accesso non attiva il blocco di classe statico.

Ciò è dovuto essenzialmente alla parola chiave final. Se si rimuove final come segue:

public class Test { 
    public static void main(String[] args) { 
    System.out.println(Hello.a1); 
    } 
} 
class Hello{ 
    static int a1=10; 
    static{ 
    System.out.println("SB"); 
    } 
} 

Vedrete che SB viene stampato come previsto.

5

Si sta utilizzando una variabile costante finale statica. Questa variabile verrà sostituita al momento della compilazione in base al valore costante effettivo, in ordine per aumentare le prestazioni. Se si dispone di uno sguardo al codice binario compilato (Sì, non è possibile;), ma tecnicamente parlando con una supposizione) che sarà qualcosa di simile a questo:

public class Test { 
    public static void main(String[] args) { 
     System.out.println(10); // Constant 
    } 
} 

class Hello { 
    static final int a1=10; 
    static { 
     System.out.println("SB"); 
    } 
} 

Sulla base di questo codice, la classe Ciao non verrà caricato in la RAM. Quindi non stamperà l'SB.

-3

Il blocco di codice statico verrà richiamato quando si crea un'istanza della classe. Prova questo:

public class Test { 
    public static void main(String[] args) { 
     Hello h = new Hello(); 
     System.out.println(Hello.a1); 
    } 
} 

class Hello { 
    static final int a1 = 10; 
    static { 
     System.out.println("SB"); 
    } 
} 
+0

Questo non è vero ... – Codebender

+1

il blocco di inizializzazione statico viene richiamato quando la classe viene caricata nella memoria. Il blocco di inizializzazione dell'istanza è quello invocato quando si crea un'istanza della classe. – Gobinath