【问题标题】:initializing a final field初始化最终字段
【发布时间】:2013-11-30 07:00:10
【问题描述】:

这个Q宁可验证:

静态 final 字段可以在声明时进行初始化:

public static final int i=87;

或在静态块中:

public static final int i;

//..........

static {
    ...
    i=87;
    ...

}

除了静态块之外,是否还有静态最终字段

public static final int i;

可以初始化吗?

提前致谢。

注意:看到Initialize a static final field in the constructor。静态块不是在声明之外初始化它的唯一地方,这并不具体。

//===============

添加:

扩展@noone 的好答案,以回应@Saposhiente 的以下内容:

在一些非静态上下文中混合:

public class FinalTest {

private static final int INT = new FinalTest().test();

private int test() {
    return 5;
}
}

【问题讨论】:

    标签: java final


    【解决方案1】:

    Java Language Specification 状态

    如果一个空白的 final (§4.12.4) 类变量是一个编译时错误 不是由静态初始化程序(第 8.7 节)明确分配(第 16.8 节) 声明它的类。

    所以答案

    除了静态块之外,是否有静态最终字段 可以初始化吗?

    不,没有。

    【讨论】:

      【解决方案2】:

      它可以在任何随机静态方法中“初始化”,但只能通过使用static 块或变量初始化间接进行。

      public class FinalTest {
      
          private static final int INT = test();
      
          private static int test() {
              return 5;
          }
      }
      

      或者像这样:

      public class FinalTest {
      
          private static final int INT;
      
          static {
              INT = test();
          }
      
          private static int test() {
              return 5;
          }
      }
      

      从技术上讲,这并不是test() 中的真正初始化,但它的行为就像一个。

      【讨论】:

        【解决方案3】:

        没有。 static 的字段属于该类,而 final 的字段必须在它变得可见时分配,因此 static final 字段必须使用声明或静态初始化程序(其中两者都被编译成相同的东西),以便在类完成加载时它具有一个值。

        【讨论】:

          【解决方案4】:

          它只能在一组总是运行一次的静态代码中初始化。这通常在它的声明或静态块中,但你也可以做一些奇怪的事情,比如

          static final int i;
          static int j = i = 1;
          

          从技术上讲,这两者都不是。无论哪种方式,您都不能在任何类型的函数或构造函数中对其进行初始化,因为该函数可能会多次运行;您必须使用静态声明或代码块来运行函数并使用返回值来初始化它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-06
            • 1970-01-01
            • 1970-01-01
            • 2019-11-13
            • 1970-01-01
            相关资源
            最近更新 更多