Java 为什么在执行静态块时该浮点常量为null?
执行以下代码时,将打印Java 为什么在执行静态块时该浮点常量为null?,java,static-initialization,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 v
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)
{
}
}
str
是编译时常量-n
不是,因为它属于Float
类型。如果将其更改为final static float n=130f
,则会在静态初始化块中看到该值
因此,目前,在静态初始值设定项块中,str
的值实际上是内联的-您的代码相当于:
System.out.println("nitesh "+test.n);
发件人:
常量表达式是表示原语类型的值或字符串的表达式,该值或字符串不会突然完成,并且仅使用以下内容组成:[……]
Float
不是基本类型
此外,即使没有内联,常量变量str
也会在执行任何静态初始化程序块之前初始化。来自(类初始化详细信息):
- 然后,初始化C的静态字段,这些字段是常量变量(§4.12.4、§8.3.2、§9.3.1)
- 接下来,按照文本顺序执行类的类变量初始值设定项和静态初始值设定项,或者执行接口的字段初始值设定项,就像它们是单个块一样
@任务:不,这绝对不是我所说的简短版本。这一切都与哪些变量实际上是编译时常量有关,它们的值在任何地方都是内联的。opps!!同意。需要花更多的时间在JavaDoc上。谢谢你的澄清。(顺便说一句,你的答案是+10)但是Float是一种基本类型@Arijit:No,
Float
是一种基本类型Float
是一种包装类型。这意味着在声明之后移动静态块也可以解决问题。