类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:
1. 创建类的实例
2. 调用类的静态方法
3. 使用类的非常量静态字段
4. 调用Java API中的某些反射方法
5. 初始化某个类的子类
6. 含有main()方法的类启动时
初始化一个类包括两个步骤:
1、 如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类
2、 如果类存在一个初始化方法,就执行此方法
注:初始化接口并不需要初始化它的父接口。
public class InstanceInitTestParent {
// 静态变量
public static String aString="父类静态变量";
// 变量
public String bString="父类变量";
// 静态初始化块1
static {
System.out.println("父类astring1:"+aString);
System.out.println("父类静态初始化块1");
}
// 静态初始化块2
static {
System.out.println("父类astring2:"+aString);
System.out.println("父类静态初始化块2");
}
// 初始化块
{
System.out.println("父类bstring:"+bString);
System.out.println("父类初始化块");
}
// 构造方法
public InstanceInitTestParent() {
System.out.println("父类构造方法");
}
public static void main(String[] args) {
InstanceInitTestParent ii=new InstanceInitTestParent();
}
}
public class InstanceInitTestSon extends InstanceInitTestParent {
// 静态变量
public static String aString="子类静态变量";
// 变量
public String bString="子类变量";
// 静态初始化块
static {
System.out.println("子类astring:"+aString);
System.out.println("子类静态初始化块");
}
// 初始化块
{
System.out.println("子类bstring:"+bString);
System.out.println("子类初始化块");
}
// 构造方法
public InstanceInitTestSon() {
// super();
System.out.println("子类构造方法");
}
public static void main(String[] args) {
InstanceInitTestSon ii=new InstanceInitTestSon();
}
}
运行结果为:
父类astring1:父类静态变量
父类静态初始化块1
父类astring2:父类静态变量
父类静态初始化块2
子类astring:子类静态变量
子类静态初始化块
父类bstring:父类变量
父类初始化块
父类构造方法
子类bstring:子类变量
子类初始化块
子类构造方法
初始化顺序为:
初始化父类静态变量、静态初始化块,按在代码中出现的顺序依次执行
初始化子类静态变量、静态初始化块,按在代码中出现的顺序依次执行
初始化父类变量、初始化快,按在代码中出现的顺序依次执行
初始化父类构造函数
初始化子类变量、初始化快,按在代码中出现的顺序依次执行
初始化子类构造函数