初始化块:
包括静态初始化块和普通初始化块。
初始化块初是构造器的补充,初始化块总在构造器之前执行。
初始化块的修饰词只能是static。
系统可以使用初始化块来进行对象的初始化操作。
基本用法:
如果有一段初始化处理代码对所有对象完全相同,且无需接收任何参数,就可把这段初始化处理代码提取到初始化中去。
优点:
提高初始化代码的复用,提高应用的维护性。
下面代码主要说明静态初始化块,普通初始化块,构造器的加载顺序:
//三个继承关系的类
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的无参构造器
*/
} |