关于类和实例变量初始化过程,我们直接看代码来解释比较好理解。
代码如下:
public class Father{
private int i = test();
private static int j = method();
static{
System.out.print("(1)");
}
Father(){
System.out.print("(2)");
}
{
System.out.print("(3)");
}
public int test(){
System.out.print("(4)");
return 1;
}
public static int method(){
System.out.print("(5)");
return 1;
}
}
public class Son extends Father{
private int i = test();
private static int j = method();
static{
System.out.print("(6)");
}
Son(){
// super();//写或不写都在,在子类构造器中一定会调用父类的构造器
System.out.print("(7)");
}
{
System.out.print("(8)");
}
public int test(){
System.out.print("(9)");
return 1;
}
public static int method(){
System.out.print("(10)");
return 1;
}
public static void main(String[] args) {
Son s1 = new Son();
System.out.println();
Son s2 = new Son();
}
}
执行结果如下:
(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)
(9)(3)(2)(9)(8)(7)
我们根据程序执行结果来分析可以得知:
类和实例变量的初始化过程:
程序首先初始化父类,再初始化子类。
具体初始化顺序如下:
第一步首先初始化类
1)静态实例变量
2)静态代码块
3)它俩谁在程序前边谁先执行
第二步初始化类的实例变量
1)初始化非静态变量
2)非静态代码块
3)它俩谁在程序前边谁先执行
4)父构造器
5)子构造器
需要注意的是程序中的test()方法为重写的方法,Son对象在初始化时执行的是Son类里的test()方法。
非静态方法前面其实有一个默认的对象this,this在构造器(或<init>)它表示的是正在创建的对象,因为这里是在创建Son对象,所以test()执行的是子类重写的代码(面向对象多态)。