为什么最终的实例变量需要初始化,而最终的局部变量不需要?

时间:2014-05-04 10:31:37

标签: java initialization final

以下示例类无法编译:

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会以不同方式处理最终实例变量和最终局部变量?谢谢。

3 个答案:

答案 0 :(得分:2)

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

如果您尝试使用 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;
    }
}

答案 1 :(得分:1)

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

对于构造函数的情况,编译器没有执行那种未使用的变量分析,只是因为(除了私有字段之外的任何东西)它可能在另一个文件中读取,编译器没有进入。

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

答案 2 :(得分:0)

最终的attricutes应该在构造函数中初始化,这就是为什么它不能在你的例子中编译。 最终变量也应在使用前初始化。没有初始化声明它的方法很好。