2012-08-08 38 views
8

在這裏我做了一個程序,當我打印constantmainstatic塊不執行.. 但是當我打印stat執行有沒有什麼重要的static final在java ..? 請解釋爲什麼靜態塊中的代碼不執行?

package com.test.doubt;` 

class Doubt { 

    public static final int constant = 123; 
    public static int stat = 123; 

    static { 
    System.out.println("Static Block"); 
    } 
} 

public class MyProgram { 

    public static void main(String[] args) { 
    System.out.println(Doubt.constant); 
    } 
} 

回答

10

static final int將作爲其值直接編譯到您的代碼中。也就是說,在JVM看到並正在執行:

System.out.println(123); 

,你就不是在所有接觸您恰當地命名爲Doubt類(這是以這種方式指定常量的說法,順便說一句。如果你改變了這個值,你必須重新編譯參考類)

+0

謝謝.. :)現在我明白了.. – jenuine 2012-08-08 11:53:47

20

代碼未初始化Doubt類,正是因爲Doubt.constant常數。它的值在編譯時被編譯爲MyProgram - 編譯後甚至可以刪除Doubt.class,程序仍然可以運行。

運行

javap -c com.test.doubt.MyProgram 

來看看到底是什麼代碼如下編譯之後。

請參閱section 15.28 of the JLS什麼構成一個常數表達式。例如,這仍然是一個常數:

public static final String FOO = "Foo"; 

等將所有這

public static final String FOO = "Foo"; 
public static final String BAR = "Bar"; 
public static final String FOOBAR = FOO + BAR; 

...但是這不會是

public static final String NOT_A_CONSTANT = "Foo".substring(0, 1); 
+0

+1換句話說,'javac'編譯器優化了'Doubt'類的需求。 – 2012-08-08 11:48:35

+3

@Thilo:不,它*的確發生在String上,只要它是一個編譯時常量。詳情請參閱JLS第15.28節。 – 2012-08-08 11:49:10

+0

'package com.test.doubt; 類懷疑{0} {0} {0} {0} \t public static int stat = 123; \t static { \t \t System.out.println(「Static Block」); \t} } 公共類MyProgram { \t公共靜態無效的主要(字串[] args){ // \t \t的System.out.println(Doubt.constant); \t \t System.out.println(懷疑。STAT); \t \t \t \t \t} } '但是這個代碼打印靜態塊,因此,我感到困惑 – jenuine 2012-08-08 11:50:03