我仍在 Java 的学习曲线上。为了更多地了解初始化 block ,我创建了一个小测试类:
public class Script {
{
Gadgets.log("anonymous 1");
}
public Script() {
Gadgets.log("constructor");
}
{
Gadgets.log("anonymous 2");
}
}
当我创建一个实例时,我得到这个日志:
Script: anonymous 1
Script: anonymous 2
Script: constructor
这告诉我,两个初始化程序 block 都在构造函数之前运行,按照它们在源代码中出现的顺序(与静态初始化程序相同)。 我想知道的是:我对这种行为有更多的控制吗? 因为 Java 文档说 ( source ):
Initializer blocks for instance variables look just like static initializer blocks, but without the static keyword:
{
// whatever code is needed for initialization goes here
}
The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.
那么“将初始化程序 block 复制到每个构造函数中”到底是什么意思呢?根据我的日志,它们似乎被复制到每个构造函数的开头。这样对吗?
如果将它们复制到每个构造函数的末尾(这是我在匿名 2 中所期望的),则在多个构造函数之间共享此类 block 也非常有意义。 有没有办法更多地控制这些 block ,或者我唯一的选择是编写命名方法的“经典”方法,如果我想在 end每个构造函数?
最佳答案
构造函数按以下顺序执行:
super()
调用,隐式或显式。- 变量初始化程序和初始化程序 block ,按照它们在源代码中出现的顺序排列。
- 构造函数的剩余部分。
这在 JLS 中指定并且不能更改。
如果存在 this()
调用,它将替换 (1) 和 (2)。
关于java - 非静态初始化 block ——我有更多的控制权吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36464818/