5.9.2 初始化块和构造器

5.9.2 初始化块和构造器

从某种程度上来看,初始化块是构造器的补充,初始化块总是在构造器执行之前执行。系统同样可使用初始化块来进行对象的初始化操作。

初始化块不能接收参数

与构造器不同的是,初始化块是一段固定执行的代码,它不能接收任何参数。因此初始化块对同个类的所有对象所进行的初始化处理完全相同。

什么时候使用初始化块

  • 如果有段初始化处理代码对所有对象完全相同,且无须接收任何参数,就可以把这段初始化处理代码提取到初始化块中。
  • 如果两个构造器中有相同的初始化代码,且这些初始化代码无须接收参数,就可以把它们放在初始化块中定义。

通过把多个构造器中的相同代码提取到初始化块中定义,能更好地提高初始化代码的复用,提高整个应用的可维护性。

编译后初始化块中的代码会插入到每个构造器的开头

实际上初始化块是一个假象,使用javac命令编译Java类后,该java类中的初始化块会消失,初始化块中代码会被”还原”到每个构造器中,且位于构造器所有代码的前面。

先初始化父类再初始化话子类

与构造器类似,创建一个Java对象时,不仅会执行该类的普通初始化块和构造器,而且系统会一直上溯到java.lang.Object类,先执行java.lang.Object类的初始化块,然后开始执行java.lang.Object的构造器,接着依次向下执行其父类的初始化块,然后开始执行其父类的构造器,以此类推。最后才执行该类的初始化块和构造器,返回该类的对象。