2012-08-08 31 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