初始化块:
包括静态初始化块和普通初始化块。
初始化块初是构造器的补充,初始化块总在构造器之前执行。
初始化块的修饰词只能是static。
系统可以使用初始化块来进行对象的初始化操作。
基本用法:
如果有一段初始化处理代码对所有对象完全相同,且无需接收任何参数,就可把这段初始化处理代码提取到初始化中去。
优点:
提高初始化代码的复用,提高应用的维护性。
下面代码主要说明静态初始化块,普通初始化块,构造器的加载顺序:
/** * * @author wuyong * @email 382999338@qq.com * @date2016年10月29日下午4:13:45 */ //三个继承关系的类 public class A { static{ System.out.println("A的静态初始化块"); } { System.out.println("A的普通初始化块"); } public A() { System.out.println("A的无参构造器"); } } public class B extends A{ static{ System.out.println("B的静态初始化块"); } { System.out.println("B的普通初始化块"); } public B() { System.out.println("B的无参构造器"); } public B(String string) { //通过this调用本类中的重载的构造器 this(); System.out.println("B的有参构造器,他的参数构造值string="+string); } } public class C extends B{ static{ System.out.println("C的静态初始化块"); } { System.out.println("C的普通初始化块"); } public C() { super("传入B有参构造器的的参数"); System.out.println("C的无参构造器"); } /* * 初始化化块、构造器在继承关系的执行顺序: * 都不仅会执行本类中的初始化化块、构造器, * 也会上溯到Object类,先执行Object的初始 * 化化块、构造器,然后在执行其父类的。。。 * 最后才会执行自身的初始化化块、构造器。 * * * 第一次创建C对象,因为系统中还不存在C类,因此需要先加载并初始化C类, * 初始化C类时会先执行其顶层的父类的静态初始化块,在执行其直接父类的 * 静态初始化块,最后在执行C本身的静态初始化块。 * C类初始化成功后,C类在该虚拟机里将一直存在,所以第二次创建C类的对象 * 时不要在在对C类进行初始化,就不要再执行静态初始化块。 * */ public static void main(String[] args) { System.out.println("第一次创建C的对象----"); new C(); System.out.println("第二次创建C的对象----"); new C(); } /* * 输出结果: * A的静态初始化块 B的静态初始化块 C的静态初始化块 第一次创建C的对象---- A的普通初始化块 A的无参构造器 B的普通初始化块 B的无参构造器 B的有参构造器,他的参数构造值string=传入B有参构造器的的参数 C的普通初始化块 执行C的无参构造器 第二次创建C的对象---- A的普通初始化块 A的无参构造器 B的普通初始化块 B的无参构造器 B的有参构造器,他的参数构造值string=传入B有参构造器的的参数 C的普通初始化块 执行C的无参构造器 */ }