我仍处于Java的学习曲线上。为了理解更多初始化块,我创建了一个小测试类:
public class Script {
{
Gadgets.log("anonymous 1");
}
public Script() {
Gadgets.log("constructor");
}
{
Gadgets.log("anonymous 2");
}
}
当我创建一个实例时,我得到了这个日志:
Script: anonymous 1
Script: anonymous 2
Script: constructor
这告诉我,两个初始化程序块都在构造函数之前运行,按它们在源代码中出现的顺序运行(与静态初始化程序相同)。 我想知道的是:我对这种行为有更多的控制吗? 因为Java Documentation说(source):
实例变量的初始化块看起来就像静态 初始化块,但没有static关键字:
{
// whatever code is needed for initialization goes here
}
Java编译器将初始化程序块复制到每个构造函数中。因此, 这种方法可用于在多个之间共享代码块 构造
那究竟是什么"将初始化程序块复制到每个构造函数中#34;意思?根据我的日志,似乎,它们被复制到每个构造函数的开头。这是对的吗?
如果将它们复制到每个构造函数的END(这是我在匿名2中所期望的那样),那么在多个构造函数之间共享这些块也会非常有意义。 有没有办法控制那些块更多或是我唯一的选择"经典"如果我想在每个构造函数的 end 执行常见任务,那么编写一个在每个构造函数中调用的命名方法的方法?
答案 0 :(得分:11)
构造函数按以下顺序执行:
super()
致电,隐式或明确。这在JLS中指定,不能更改。
如果存在this()
来电,则会替换(1)和(2)。