为什么在执行静态块时此Float常量为null?

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)

JLS第15.28节(常量表达式):

常量表达式是表示基本类型的值的表达式或不突然完成的字符串,仅使用以下内容组成:[...]

Float 不是原始类型.

此外,即使没有内联,str也会在执行任何静态初始化程序块之前初始化常量变量.从JLS的第12.4.2节(类初始化细节):

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

  • @Arijit:不,`float`是一种原始类型.`Float`是一个包装类型.他们是不同的. (6认同)