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

时间:2014-06-13 10:14: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)
      {
      }
}

1 个答案:

答案 0 :(得分:25)

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

目前,在静态初始化程序块中,str的值实际上是内联的 - 您的代码等同于:

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

来自JLS section 15.28 (constant expressions)

  

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

Float不是原始类型。

此外,即使没有内联,也会在执行任何静态初始化程序块之前初始化常量变量str。从section 12.4.2 of the JLS(类初始化详细信息):

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