Nit*_*its 18 java static-initialization
以下代码在执行时打印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)
{
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 25
str是一个编译时常量 - n不是,因为它是类型Float.如果将其更改为,final static float n = 130f则会在静态初始化块中看到该值.
所以目前,在静态初始化程序块中,str实际上是内联的值- 您的代码相当于:
System.out.println("nitesh "+test.n);
Run Code Online (Sandbox Code Playgroud)
常量表达式是表示基本类型的值的表达式或不突然完成的字符串,仅使用以下内容组成:[...]
Float 不是原始类型.
此外,即使没有内联,str也会在执行任何静态初始化程序块之前初始化常量变量.从JLS的第12.4.2节(类初始化细节):
- ...
- 然后,初始化C的静态字段,它们是常量变量(§4.12.4,§8.3.2,§9.3.1).
- ...
- 接下来,按文本顺序执行类的类变量初始值设定项和类的静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样.
| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |