В 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;
}
};
Есть ли способ инициализировать наследуемое поле 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) {
};
Обновление: добавлен конструктор для использования значения по умолчанию
Конечные переменные экземпляра должны быть инициализированы в конструкторе.
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;
}
}
final
поле из подкласса, - через супер-конструктор. Таким образом, этот дубликат охватывает единственную действительную ситуацию для вашего вопроса.