java - 有没有办法在匿名类中初始化最终字段?

标签 java inheritance final

在Java中,我们可以初始化一个final基类及其子类的构造函数中的字段,以及基类的内联初始化 block 中的字段。然而,我们似乎无法初始化final子类中内联初始化 block 中的字段。此行为主要影响匿名类,其中 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;
    }
};

有没有办法初始化继承的final匿名类中的字段?

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

最佳答案

您必须在声明期间或构造函数中初始化最终实例变量。但是,您可以向构造函数提供值

abstract class MyTest {

    final protected int field;

    public MyTest() {
        // default value
        this(0);
    }

    public MyTest(int f) {
        field = f;
    }

}


MyTest anonymTest = new MyTest(3) {
};

更新:添加了使用默认值的构造函数

关于java - 有没有办法在匿名类中初始化最终字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36411092/

相关文章:

java - 如何命名自己项目的包?

c++ - 创建类模板的子类

Java继承,使用super()

java - 如何在 Java 8 Lambdas 中使用非最终变量

java - 为什么我的应用程序在启动后立即停止工作(但没有任何错误消息)?

JavaFX 图像填充

java - 在ArrayBlockingQueue中,为什么将final成员字段复制到本地final变量中?

java - 为什么要在 Java 中声明一个不可变类 final?

java - Spring、Hibernate 和 .xml 错误

c++ - 我不明白我为这个程序得到的输出。