这个代码块在java中的基本原理是什么?

26 java initialization construct

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

class Student
{
    {
        System.out.println("Called when Student class is instantiated.");
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 48

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

当你编写一个匿名类时,它也可能有用 - 你不能编写构造函数,但你可以编写一个初始化程序块.例如,我已经看到这用于JMock测试.

  • 初始化块的另一个好处是:它们可以分配最终的实例字段.对于从多个构造函数调用的函数,这是不可能的. (3认同)
  • +1为匿名类提及.绝对是我最常用的初始化程序块. (2认同)

Mat*_*all 20

它被称为初始化块.

Java编译器将初始化程序块复制到每个构造函数中.因此,该方法可用于在多个构造函数之间共享代码块.


Sta*_*lin 5

它叫做init block.在这样的块中,您可以为所有构造执行相同的逻辑,也可以将相同字段的声明初始化分开.

upd,当然还有双括号初始化,比如

List<Integer> answers = new ArrayList<Integer>(){{add(42);}}
Run Code Online (Sandbox Code Playgroud)


Mat*_*lis 5

这是一个初始化块.正如Matt Ball所提到的,它们被复制到每个构造函数中.

您可能有兴趣了解静态初始化块(也在Matt的链接中):

public class Foo {
    static {
        System.out.println("class Foo just got initialized!");
    }

    {
        System.out.println("an instance of Foo just got initialized!");
    }
}
Run Code Online (Sandbox Code Playgroud)