在java中使这种代码有效的原因是什么?它是出于某种特定原因而存在,还是仅仅是其他Java语言设计决策的副产品?难道你不能只使用consructor来达到同样的效果吗?
class Student
{
{
System.out.println("Called when Student class is instantiated.");
}
}
答案 0 :(得分:48)
有一点是它将执行调用任何构造函数。如果你有几个构造函数并且它们不相互调用(无论出于何种原因,例如每个想要调用直接相应的超类构造函数),这是确保为所有构造函数执行相同代码的一种方法,而不是将其放入一种可以在其他地方调用的方法。
当您编写匿名类时,它也可能有用 - 您无法编写构造函数,但可以编写初始化程序块。例如,我已经看到这用于JMock测试。
答案 1 :(得分:20)
它被称为initializer block。
Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。
答案 2 :(得分:5)
它调用了 init块。在这样的块中,您可以执行与所有构造相同的逻辑,也可以分离相同字段的声明和初始化。
upd ,当然还有 double brace 初始化,比如
List<Integer> answers = new ArrayList<Integer>(){{add(42);}}
答案 3 :(得分:5)
这是一个初始化块。正如Matt Ball所提到的,它们被复制到每个构造函数中。
您可能有兴趣了解静态初始化块(也在Matt的link中):
public class Foo {
static {
System.out.println("class Foo just got initialized!");
}
{
System.out.println("an instance of Foo just got initialized!");
}
}