我仍然在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文档说(source):
实例变量的初始化块看起来就像静态初始化器块,但是没有静态关键字:
{
// whatever code is needed for initialization goes here
}Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可以用于在多个构造函数之间共享代码块。
那么,“将初始化程序块复制到每个构造函数中”到底意味着什么?根据我的日志,它们似乎是在每个构造函数的开头复制的。是这样的吗?
如果将这些块复制到每个构造函数的末尾(这正是我在匿名2中所期望的),那么在多个构造函数之间共享这样的块也是非常有意义的。是否有一种更多地控制这些块的方法,还是我唯一的选择--编写一个命名的方法,如果我想在每个构造函数的末尾执行公共任务,那么这个方法在每个构造函数中都会被调用?
发布于 2016-04-07 00:54:53
构造函数按以下顺序执行:
super()调用,隐式或显式。这是在JLS中指定的,不能更改。
如果存在this()调用,则替换(1)和(2)。
https://stackoverflow.com/questions/36464818
复制相似问题