有没有办法在anonymus类中初始化final字段?

时间:2016-04-04 19:20:18

标签: java inheritance final

在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字段?

评论:这个问题不是关于构造函数,而是关于最终字段初始化。

2 个答案:

答案 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;
}

}