实例初始值设定项与构造函数有什么不同?
换句话说,你为什么需要一个实例初始值设定项? 你在编写一个实例初始化程序的时候有什么不同或者有什么优势?
这似乎解释得很好:
实例初始值设定项是实例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文档