实例初始值设定项与构造函数有什么不同?

换句话说,你为什么需要一个实例初始值设定项? 你在编写一个实例初始化程序的时候有什么不同或者有什么优势?

这似乎解释得很好:

实例初始值设定项是实例variables初始值设定项的一个有用的select,

  • 初始化代码必须捕获exception,或者

  • 执行无法用实例variables初始值设定项expression的花式计算。 当然,你可以总是在构造函数中写这样的代码。

但是在具有多个构造函数的类中,必须在每个构造函数中重复该代码。 使用实例初始化程序,只需编写一次代码即可,无论使用何种构造函数创build对象,都会执行该代码。 实例初始化器在匿名内部类中也很有用,它们根本不能声明任何构造函数。

来自: Java中的 JavaWorld 对象初始化 。

在对象生命周期方面,没有区别。 两者都在施工时被调用,逻辑上初始化块可以被认为是施工的一部分。

从语义上讲,初始化器是一个很好的工具,有以下几个原因:

初始化程序可以通过将初始化逻辑保持在被初始化的variables旁边来提高代码的可读性:

public class Universe { public int theAnswer; { int SIX = 6; int NINE = 7; theAnswer = SIX * NINE; } // a bunch of other vars } 

VS

  public class Universe { public int theAnswer; // a bunch of other vars public Universe() { int SIX = 6; int NINE = 7; theAnswer = SIX * NINE; // other constructor logic } } 

无论使用哪个构造函数,都会调用初始化器。

初始化器可以用在匿名的内部类中,而构造函数则不能。

当你有许多构造函数,并希望为每个构造函数执行一些公共代码时,可以使用实例初始化方法。

我会避免一般的实例初始化成语 – 它通过variables初始化的唯一真正的优点是exception处理。

由于一个init方法(可以从构造函数中调用)也可以做exception处理,也集中了构造函数的设置代码,但是具有可以对构造函数参数值进行操作的优点,我会说实例的初始化方法是多余的,避免。

当我们使用一个匿名的内部类时,可以看到实例初始化符比构造函数真正优点

匿名内部类不能有一个构造函数 (因为它们是匿名的) 所以它们非常适合实例初始化器

初始化器是在构造函数之间共享代码的方法,如果初始化器与variables声明一起使用,它使代码更具可读性。

Java编译器将初始化块复制到每个构造函数中。 因此,这种方法可以用来在多个构造函数之间共享一段代码。 Oracle文档