Java 编译时错误“;“最终变量未初始化”;

Java 编译时错误“;“最终变量未初始化”;,java,constructor,final,Java,Constructor,Final,我遇到了一个问题,在尝试一些代码片段时,我遇到了一个代码错误 class O { final int i; O() { i=10; } O(int j)// error here as THE BLANK FINAL FIELD i IS NOT INITIALIZED { j=20; System.out.println(j); } } class Manager3 { public

我遇到了一个问题,在尝试一些代码片段时,我遇到了一个代码错误

class O
{
    final int i;
    O()
    {
        i=10;
    }
    O(int j)// error here as THE BLANK FINAL FIELD i IS NOT INITIALIZED
    {
        j=20;
        System.out.println(j);
    }
}
class Manager3
{
    public static void main(final String[] args) 
    {
        O n1=new O();
        //O n2=new O(10);
        //n1.i=20;
        //System.out.println(j1.i);
    }
}
但是如果我用参数注释构造函数,我不会得到任何错误

我的问题是,为什么我把构造函数都放在代码中时会出现编译时错误,为什么我删除参数化构造函数时不会出现任何错误

我知道我们必须初始化我的最后一个变量,但我正在构造函数中初始化它,因此,如果我编写以下代码:-

class O
{
    final int i;
    O()
    {
        i=10;
    }

}
class Manager3
{
    public static void main(final String[] args) 
    {
        O n1=new O();

    }
}
所有这些都工作正常,代码正在编译

我的问题是,如果我引入另一个构造函数,问题是什么。甚至错误也在我写参数化cons的那一行

我了解JAVA,但我对这段代码感到困惑

final int i;
您已将
i
定义为
final
。只能在构造函数中为最终变量赋值

 O(int j)// error here as THE BLANK FINAL FIELD i IS NOT INITIALIZED
    {
        j=20;
        System.out.println(j);
    }
这里您没有为
i
赋值。如果有人使用此构造函数(带参数的构造函数)创建对象,
i
值将不会被赋值

如何解决此问题?


正如您所说的,您必须对该构造函数进行注释(或)在该构造函数中分配
i
值,就像在其他构造函数中一样。

必须在声明时初始化
final
变量,或将其分配给构造函数体中的值。 如果不初始化
final
变量,则会出现编译器错误

如果调用第二个构造函数,变量永远不会被赋值。

O(int j){
   O(int j){
        this(); // <----- you can add this line. 
        j=20;
        System.out.println(j);
    }

this();//“i”是一个实例最终变量,因此我们需要在我定义的每个构造函数中初始化它。

你是对的,我期望的真正答案是“i”是类变量,因此我需要在我定义的每个构造函数中初始化它。@Ali:1)我是实例变量,而不是类变量。2)所有实例变量都不需要在构造函数中赋值,除非它们是final并且尚未赋值。@Ali:如果从i声明中删除final,则不会出现编译器错误。如果r的意图是测试SO people,你肯定会得到非常好的答案。@Nimbari,不,我的意图不是测试SO people,但我真的很困惑,我知道解决方案,但不知道最终变量是在我们定义它们时初始化的,还是在该类的每个构造函数中初始化的。@Ali:没问题,希望你是现在清楚了。顺便说一句,谢谢你接受我的回答。