2014-06-13 18 views
18

以下代码在执行时会打印nitesh null而不是预期的nitesh 130。 为什么在执行静态块之前未初始化n当执行静态块时,为什么这个Float常量为null?

class test 
{ 
     static 
     { 
      System.out.println(test.str+" "+test.n); 
     } 
     final static String str="nitesh"; 
     final static Float n=130f; 
     public static void main(String []args) 
     { 
     } 
} 
+8

['这个问题应该被关闭,因为它是由JonSkeet'回答](http://meta.stackexchange.com/a/13300/256679) –

回答

25

str是一个编译时间常数 - n不是,因为它是Float类型。如果将其更改为final static float n = 130f,则会在静态初始化块中看到该值。

所以目前,在静态初始化代码块的str价值实际上是被内联 - 你的代码就相当于:

System.out.println("nitesh "+test.n); 

JLS section 15.28 (constant expressions)

常量表达式是一个表达式表示原始类型的值或不完全突然完成的字符串,并且仅由以下内容组成:[...]

Float不是原始类型。

此外,即使没有内联,常量变量str在任何静态初始化块被执行之前被初始化。从section 12.4.2 of the JLS(类的初始化信息):

  • ...
  • 然后,初始化C的静态字段这是不变的变量(§4.12.4,§8.3.2,§9.3.1) 。
  • ...
  • 接下来,按照文本顺序执行类的类变量初始值设定项和静态初始值设定项或接口的字段初始值设定项,就像它们是单个块一样。
+0

@task:不,这绝不是一个我说的更短的版本。这与所有变量实际上是编译时常量有关,无论它们在何处使用它们的值都是内联的。 –

+0

反对!同意。需要花更多的时间用JavaDoc。 _谢谢澄清._(_顺便说一句+10为你的答案) –

+0

但是Float是原始类型http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – Arijit

相关问题