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

2022-09-02 21:18:03

执行时,将打印以下代码,而不是预期的 。为什么在执行静态块之前没有初始化?nitesh nullnitesh 130n

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)
      {
      }
}

答案 1

str是编译时常量 - 不是,因为它的类型为 。如果将其更改为,则会在静态初始化块中看到该值。nFloatfinal static float n = 130f

因此,目前,在静态初始值设定项块中,的值实际上是内联的 - 您的代码等效于:str

System.out.println("nitesh   "+test.n);

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

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

Float不是基元类型。

此外,即使没有内联,常量变量也会在执行任何静态初始值设定项块之前初始化。来自 JLS 的第 12.4.2 节(类初始化详细信息):str

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

答案 2

推荐