【发布时间】:2016-07-21 07:07:23
【问题描述】:
来自 Oracle 的 guide,初始化字段(强调我的):
Java 编译器将初始化程序块复制到每个构造函数中。因此,这种方法可以用来在多个构造函数之间共享一个代码块。
另外,来自 DOJ 的 article 关于 Java 中的实例初始化程序(重点是我的):
实例初始化块代码在构造函数中调用 super() 之后立即运行,换句话说,在所有超级构造函数都运行之后。
考虑到这一点,为什么每次我尝试在实例初始化程序块中使用(分配的)最终字段时,我的编译器都会警告我,如下所示?
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() 之后立即运行 因此,在构造函数的其余代码之前,初始化final 字段,被执行。这也正是警告信息所传达的内容。
-
另见stackoverflow.com/questions/20593606/…(问题不好,但答案还可以)
标签: java initializer