初始化块 类里的第4种成员(除Field、方法和构造器)
初始化块的修饰符只能是static.创建对象时先按照顺序依次执行初始化块,然后执行构造器。
与构造器不同的是,初始化块是一段固定执行的代码,它不接收任何参数,因此初始化块对同一个类的所有对象的初始化处理完全相同。
与构造器类似,创建一个对象时,先向上追溯先执行父类中的初始化块,依次往下执行。
系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行,因此静态初始化块总是比普通初始化块先执行。
class Root
{
static
{
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root()
{
System.out.println("Root的无参数构造器");
}
}
class Mid extends Root
{
static
{
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid()
{
System.out.println("Mid的无参数构造器");
}
}
class Leaf extends Mid
{
static
{
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf()
{
System.out.println("Leaf的无参数构造器");
}
}
public class Test
{
public void main(String[] args)
{
new Leaf();
System.out.println("\n\n");
new Leaf();
}
}
执行结果为:
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数构造器
Mid的普通初始化块
Mid的无参数构造器
Leaf的普通初始化块
Leaf的无参数构造器
Root的普通初始化块
Root的无参数构造器
Mid的普通初始化块
Mid的无参数构造器
Leaf的普通初始化块
Leaf的无参数构造器
第一次创建Leaf对象时执行了静态初始化块,第二次没有执行。说明一旦Leaf类初始化成功后,Leaf类在该虚拟机里将一直存在,因此在第二次创建Leaf实例时无须再次对Leaf进行初始化。