Java中这个代码块背后的原理是什么?

2022-09-01 16:28:55

使这种代码在java中有效的原理是什么?它是出于某种特殊原因而存在的,还是只是其他Java语言设计决策的副产品?难道你不能只使用consructor来达到同样的效果吗?

class Student
{
    {
        System.out.println("Called when Student class is instantiated.");
    }
}

答案 1

一点是它将执行调用的任何构造函数。如果你有几个构造函数,并且它们不相互调用(无论出于何种原因,例如,每个构造函数都想要调用直接对应的超类构造函数),这是确保为所有构造函数执行相同代码的一种方法,而不是将其放在可以在其他地方调用的方法中。

当您编写匿名类时,它也可能很有用 - 您无法编写构造函数,但可以编写初始值设定项块。例如,我已经看到它用于JMock测试。


答案 2

它称为初始值设定项块

Java 编译器将初始值设定项块复制到每个构造函数中。因此,此方法可用于在多个构造函数之间共享一个代码块。