为什么我不能在实例初始化块中使用final字段?
问题描述:
从Oracle的guide,初始化场(重点煤矿):为什么我不能在实例初始化块中使用final字段?
Java编译器副本初始化语句块到每一个构造函数。因此,这种方法可以用来在多个构造函数之间共享一段代码。
此外,从司法部的article关于Java实例初始化(重点煤矿):
实例的初始化块代码中调用超()在构造之后运行,换句话说,后所有超级构造函数都运行了。
考虑到这一点,为什么每次我尝试在下面的实例初始化块中使用(分配的)最终字段时,编译器都会发出警告?
final class PpTitleBook implements TitleBook {
private final Resources resources;
private final Log log;
PpTitleBook(Resources resources, Log log) {
this.resources = resources;
this.log = log;
}
{
String[] resTitles = resources.getStringArray(R.array.titles);
if (book().getAllKeys().isEmpty()) {
for (int i = 0; i < resTitles.length; i++) {
newTitle(resTitles[i]);
}
}
}
我没有其他的构造函数旁边的上面显示。那么警告背后的真正原因是什么?
答案在于以下问题:*实例初始化块代码在构造函数中调用super()之后运行*因此,在构造函数的其余代码初始化最终字段之前执行。而这正是警告信息所说的。 –
另请参见http://stackoverflow.com/questions/20593606/how-non-static-initializer-block-invoked?rq=1(问题是坏的,但答案是好的) –