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
是一种包装类型。这意味着在声明之后移动静态块也可以解决问题。