【问题标题】:Why does a final instance variable require initialization, when a final local variable does not?为什么最终实例变量需要初始化,而最终局部变量不需要?
【发布时间】:2014-06-20 17:36:00
【问题描述】:

以下示例类无法编译:

class Test {
    final int x;  // Compilation error: requires initialization.
}

这段代码的编译错误信息是:

..\src\pkgs\main\Test.java:3: error: variable x might not have been initialized
class Test {
^

但是,Java 不会为包含以下方法的类生成任何错误消息:

class Test {
    void method() {
        final int x;  // Compiles OK; has no initialization.
    }
}

关于初始化及其要求,为什么 Java 对待 final 实例变量和 final 局部变量的方式不同?谢谢。

【问题讨论】:

  • 为什么很难知道。一个可能的论点:最终变量必须在使用之前进行初始化——如果不使用,则不需要初始化。 final 字段必须在构造函数的末尾进行初始化——此时对象及其所有字段都可供任何人使用,编译器不必费劲地判断它是否可能被访问.

标签: java initialization final


【解决方案1】:

任何使用,即阅读,第二种情况给你一个error。但是未使用的变量算作警告,而不是错误;运行的代码的含义是明确的,如果很可能是错误的。

对于构造函数的情况,编译器不会执行那种未使用的变量分析,这仅仅是因为(对于除私有字段之外的任何内容)它可能会在编译器无权访问的另一个文件中读取。

因此需要将其作为错误捕获,以避免运行时行为最终取决于未指定的 JVM 实现细节。

【讨论】:

    【解决方案2】:

    Final attricutes 应该在构造函数中初始化,这就是它在您的示例中无法编译的原因。 最终变量也应该在使用之前进行初始化。声明 it 方法而不初始化也可以。

    【讨论】:

      【解决方案3】:

      实例隐式使用实例变量。您给出的局部变量示例没有使用局部变量,因此没有错误(未使用变量)。

      如果您尝试使用 x:

      ,您的局部变量示例将无法编译(出现相同的错误)
      class Test {
      
          Test() {
              final int x;
              System.out.println(x); // <== Compilation error - "variable x might not have been initialized"
          }
      }
      

      同样,你的第一个例子很好,只要你在某个时候初始化变量,不一定在声明中:

      class Test {
          final int x;
      
          Test() {
              this.x = 10;
          }
      }
      

      【讨论】:

      • @AlanStokes:我意识到我没有解决另一半。希望现在可以了。
      猜你喜欢
      • 2015-08-29
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      相关资源
      最近更新 更多