2015-07-10 68 views

回答

10

A static final字段實現爲編譯時常量,它在訪問方法/類中複製,而不引用定義的上下文(其類)。這就是爲什麼訪問它不會觸發靜態類塊的原因。

這基本上是由於final關鍵字。如果刪除final如下:

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

你會看到如預期SB打印。

5

您正在使用靜態最終常量變量。爲了提高性能,這個變量將在編譯時被實際的常量值替換。如果你看一下編譯後的二進制代碼(是的,你不能;),但在技術上並假設說)這將是與此類似:

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

在此基礎上的代碼,類你好不會被加載到RAM。所以它不會打印SB。

-3

當您創建類的實例時,您的靜態代碼塊將被調用。試試這個:

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

這不是真的...... – Codebender

+1

靜態初始化塊是在類加載到內存時調用的。實例初始化塊是您創建類的實例時調用的塊。 – Gobinath