2015-07-10 15 views

Antwort

10

Ein static final Feld wird als Kompilierzeitkonstante implementiert, die in der zugreifenden Methode/Klasse repliziert wird, ohne auf den Definitionskontext (seine Klasse) Bezug zu nehmen. Aus diesem Grund löst der Zugriff auf den statischen Klassenblock nicht aus.

Dies ist im Wesentlichen aufgrund der final Schlüsselwort. Wenn Sie final entfernen wie folgt:

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"); 
    } 
} 

Sie werden sehen, dass SB gedruckt wird, wie erwartet.

5

Sie verwenden statische endgültige konstante Variable. Diese Variable wird zur Kompilierzeit durch den tatsächlichen konstanten Wert ersetzt, um die Leistung zu erhöhen. Wenn Sie einen Blick auf den kompilierten Binärcode haben (Ja, Sie können nicht), aber technisch gesehen mit einer Annahme) es etwas Ähnliches wie das sein wird:

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"); 
    } 
} 

auf diesem Code-Basis, Klasse Hallo wird nicht in geladen werden das RAM. So wird der SB nicht gedruckt.

-3

Ihr statischer Codeblock wird aufgerufen, wenn Sie eine Instanz der Klasse erstellen. Versuchen Sie Folgendes:

+0

Dies ist nicht wahr ... – Codebender

+1

statische Initialisierung wird aufgerufen, wenn die Klasse in den Speicher geladen wird. Der Instanzinitialisierungsblock ist derjenige, der aufgerufen wird, wenn Sie eine Instanz der Klasse erstellen. – Gobinath