2013-04-06 48 views
7

在为类静态变量访问最终静态变量时为什么静态块未在java中处理?在java中未处理的静态块

class Foo { 
    public static final int BAR; 
    static { 
    System.out.println("Hello"); 
    } 
    } 
class Baz { 
    public static void quux() { 
    System.out.println(Foo.BAR); 
    } 
} 

回答

11

有时它会 - 这取决于变量是否实际上是一个恒定

  • 它必须是一个字符串或一个原始变量(可能任何其他类与空值;我必须检查)
  • 初始化表达式必须是一个常量表达式

如果是这种情况,那么对变量的任何引用都会有效地转化为值。因此,在这个代码:

class Foo { 
    public static final int BAR = 5; 
} 

class Baz { 
    public static void quux() { 
     System.out.println(Foo.BAR); 
    } 
} 

Baz的方法编译成一样代码:

public static void quux() { 
    System.out.println(5); 
} 

有没有留在字节码的Foo.BAR暗示,因此Foo不需要初始化当该方法执行时。

如果你想防止这种情况发生,你总是让它不能在变量初始化器中用常量表达式进行初始化。例如:

class Foo { 
    public static final int BAR; 

    static { 
     BAR = 5; 
    } 
} 

class Baz { 
    public static void quux() { 
     System.out.println(Foo.BAR); 
    } 
} 

这将是足以让Foo.BAR至于编译器来说不能算作一个常数。