我最近注意到java中的这个构造允许在构造函数被调用之前执行代码:
public class Foo {
{
System.out.println("before constructor 1");
}
public Foo () {
System.out.println("constructor");
}
{
System.out.println("before constructor 2");
}
}
使用此类时,调用构造函数时:
new Foo();
这到达输出:
before constructor 1
before constructor 2
constructor
我想了解更多关于这个结构的信息:它是如何调用的,当它被添加时,文档页面网址...
答案 0 :(得分:4)
编译器按照给定的顺序连接类中的所有实例初始化块,然后将结果复制到所有构造函数的开头,包括隐式的无参数(如果适用)。
这些语义的唯一不同之处在于,如果您只是将此代码复制到构造函数中,那么就是在进行超类构造函数调用时。实例初始化程序允许您拥有在调用super()
之前运行的代码,但语言规则不允许您使用此属性编写构造函数。
类似的机制用于处理字段初始化程序。当您定义这样的字段时:
int something = 3;
它将生成something = 3
并将其复制到每个构造函数的开头(之前任何实例初始化者)。