【问题标题】:Compile time error "final variable is not initialized"编译时错误“最终变量未初始化”
【发布时间】:2012-10-24 15:35:45
【问题描述】:

我有一个问题,在尝试几个代码 sn-ps 时我遇到了一个代码

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();

    }
}

一切正常,代码正在编译。

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

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

【问题讨论】:

    标签: java constructor final


    【解决方案1】:
    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 值,就像您在其他构造函数中所做的那样。

    【讨论】:

    • 你说得对,我期待的真正答案是,“i”是一个类变量,因此我需要在我定义的每个构造函数中初始化它。
    • @Ali: 1) i 是实例变量,而不是类变量。 2) 所有实例变量都不需要在构造函数中赋值,除非它们是最终的并且尚未赋值。
    • @Ali:如果你从 i 声明中删除 final,你不会得到编译器错误。如果您的意图是测试 SO 人,那么您肯定会得到非常好的答案。
    • @Nimbari,不,我的意图不是测试 SO 人,但我真的很困惑,我知道解决方案,但不知道最终变量将在我们定义时被初始化它们或该类的每个构造函数中。
    • @Ali:没问题,希望你现在清楚了。顺便说一句,感谢您接受作为答案。
    【解决方案2】:
       O(int j){
            this(); // <----- you can add this line. 
            j=20;
            System.out.println(j);
        }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-26
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          • 1970-01-01
          • 2019-07-12
          • 2013-07-04
          相关资源
          最近更新 更多