【问题标题】:Can't reassign final variable in constructor for inherited class无法在继承类的构造函数中重新分配最终变量
【发布时间】:2019-08-27 16:05:04
【问题描述】:

我检查了整个互联网是否可以在 java 的构造函数中重新分配最终变量,并且到处都说有可能。然而对我来说,在 2019 年 6 月的 Eclipse 中,尝试这样做时它给了我一个错误:

感谢您的帮助!

这里是相同的代码,和文本一样:

public class FinalClass {
  final int n = 5;
}

class InheritedClass extends FinalClass {
    {
        n = 6;
    }
}

从命令行编译时会产生此错误:

C:\stuff>javac FinalClass.java
FinalClass.java:7: error: cannot assign a value to final variable n
        n = 6;
        ^
1 error

【问题讨论】:

  • 将链接发布到“无处不在”。
  • 如果您打算让构造函数重新分配值,为什么不直接删除第一个分配?
  • @chrylis 使用此方面的一个示例:stackoverflow.com/questions/5093744/…
  • 您刚刚发布了一个链接,指向一个关于“为什么这行得通?”的问题?
  • 当它说你可以做到这一点时,我认为它们不是子类的意思。

标签: java variables inheritance constructor final


【解决方案1】:

如果您可以在 java 的构造函数中重新分配最终变量,并且在它所说的任何地方都可以

他们确实说你可以(实际上:必须)分配到一个 final 字段,只需要从类自己的构造函数中进行一次。

他们没有说你可以重新分配一个 final 字段,他们也没有说你可以从子类构造函数中做到这一点。他们不这么说,因为你不能。

如果您希望子类可以选择指定值,则需要子类可以调用的protected 构造函数。而且由于不能重新赋值,所以需要编写一个无参数的构造函数来设置默认值。

public class FinalClass {
    final int num;

    public FinalClass() {
        this.num = 5; // or: this(5);
    }

    protected FinalClass(int num) {
        this.num = num;
    }
}

public class InheritedClass extends FinalClass {
    public InheritedClass() {
        super(6);
    }
}

【讨论】:

  • 谢谢,这正是我需要的解决方案!
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多