以下代码在执行时会打印nitesh null
而不是预期的nitesh 130
。
为什么在执行静态块之前没有初始化n
?
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)
{
}
}
答案 0 :(得分: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)。
- ...
- 接下来,按文本顺序执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样。