当前位置: 首页 > 知识库问答 >
问题:

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

易和怡
2023-03-14

下面的示例类无法编译:

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个答案

诸修伟
2023-03-14

最终的疲惫应该在构造函数中初始化,这就是为什么它不会在你的示例中编译。最后一个变量在使用之前也应初始化。在不初始化的情况下声明它的方法是可以的。

薛高澹
2023-03-14

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

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

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

郑正阳
2023-03-14

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

如果您尝试使用 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;
    }
}
 类似资料:
  • 如果我在我的类中创建一个bool,就像一样,它默认为false。 当我在我的方法中创建相同的bool时,我得到一个错误“使用未分配的局部变量检查”。为什么?

  • 问题内容: 在lambda中,局部变量需要是最终变量,而实例变量则不需要。为什么这样? 问题答案: 字段和局部变量之间的根本区别在于,当JVM创建lambda实例时,将复制局部变量。另一方面,字段可以自由更改,因为对它们的更改也将传播到外部类实例(它们的范围是整个外部类,如Boris所指出的)。 考虑到匿名类,闭包和Labmdas的最简单方法是从可变范围的角度来看。想象一个为传递给闭包的所有局部变

  • 我想了解各种情况下类实例的初始化 在JLS-7第12.5节中,没有提到如何以及何时初始化最终实例变量?如果实例变量被声明为final,是否有人能给我一点参考来理解其行为? 给出的输出如下 在哪里作为 是否将输出作为

  • print语句会导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经有一个默认值(float=0.0f),为什么我需要定义一个呢? 所以,这是有效的 谢谢大家!

  • 问题内容: 来自Sun文档 通常,您需要将代码放在构造函数中以初始化实例变量。 使用构造函数初始化实例变量有两种选择:初始化块和final方法。 我能理解初始化块的用法。谁能解释一下实例初始化方法的最终方法吗?非最终公开赛员可以完成这项工作。为什么不只是使用它们呢? 问题答案: 您链接到的同一Sun教程中已经描述了该优点: 最终方法不能在子类中覆盖。 有关接口和继承的课程将对此进行讨论。 非最终方

  • 问题内容: print语句导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经具有默认值(float = 0.0f) ,为什么需要定义一个? 所以这有效 感谢大家! 问题答案: 因为它是一个局部变量。这就是为什么什么都没有分配的原因: 局部变量略有不同。编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化本地变量,请确保在尝试使用它之前为其分配一个值。访