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

时间:2012-10-24 15:35:46

标签: 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 static void main(final String[] args) 
    {
        O n1=new O();
        //O n2=new O(10);
        //n1.i=20;
        //System.out.println(j1.i);
    }
}

但如果我用参数i对构造函数进行注释,则不会出现任何错误。

我的问题是,当我将构造函数放在代码中以及为什么在删除参数化构造函数时没有出现任何错误时,为什么我会收到此编译时错误。

我知道我们必须初始化我的最终变量,但是我在构造函数中初始化它,因此如果我编写这段代码: -

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

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

    }
}

每一个都工作正常,代码正在编译。

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

我对JAVA有所了解,但我对此代码感到困惑。

4 个答案:

答案 0 :(得分:7)

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值进行注释。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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