在Java中,我们可以在基类及其子类中以及基类中的内联初始化块中初始化构造函数中的final
字段。但是,似乎我们无法在子类中的内联初始化程序块中初始化final
个字段。此行为主要影响无法调用super
构造函数的匿名类。
abstract class MyTest {
final protected int field;
public MyTest() {
// default value
field = 0;
}
}
MyTest anonymTest = new MyTest() {
{
// Error: The final field MyTest.field cannot be assigned
field = 3;
}
};
有没有办法在anonymus类中初始化继承的final
字段?
评论:这个问题不是关于构造函数,而是关于最终字段初始化。
答案 0 :(得分:5)
您必须在声明期间或构造函数中初始化最终实例变量。但是,您可以为构造函数
提供值abstract class MyTest {
final protected int field;
public MyTest() {
// default value
this(0);
}
public MyTest(int f) {
field = f;
}
}
MyTest anonymTest = new MyTest(3) {
};
更新:添加了使用默认值
的构造函数答案 1 :(得分:1)
必须在构造函数中初始化最终实例变量。
abstract class MyTest {
final protected int field;
public MyTest() {
// default value
field = 0;
}
public MyTest(int val)
{
// will set the final field to the specified val
field = val;
}
}