java对象的初始化过程如下:
- 初始化父类的静态成员
- 初始化父类的静态代码块
- 初始化子类的静态成员
- 初始化子类的静态代码块
- 初始化父类的非静态成员
- 初始化父类的非静态代码块
- 初始化父类的构造方法
- 初始化子类的非静态成员
- 初始化子类的非静态代码块
- 初始化子类的构造方法
也就是说静态成员和静态代码块优先执行(静态成员随着类加载而加载优先),接着才是非静态成员。构造方法最后执行。注意:存在着显式初始化和默认初始化。 默认初始化指的是假如成员变量为int,就默认值为0,成员变量为对象,就默认为空,
然后执行显式初始化或构造代码块(看那个放在前面)
class Fu{ /** 注意:当创建子类对象时,找到父类,内存中有两个num 先对num进行了默认初始化,num =0, 紧接着由于下面语句对父类的num进行了显式初始化,num=9,子类的num仍旧为0(当然了, 构造代码块若放在显式初始化前面的话,先执行构造代码块) */ int num =9; // 显式初始化为9 { System.out.println("Fu constructor code.." +num); } Fu(){ super(); // 显式初始化 //构造代码块初始化 System.out.println("fu constructor run"); show(); } void show(){ System.out.println("fu show ..." + num); } } class Zi extends Fu{ int num=8; // 构造代码块 { System.out.println("zi constructor code ..."+ num); } //子类构造函数 Zi(){ super() ; // 显式初始化 System.out.println("zi constructor "+num); } void show(){ System.out.println("zi show .." +num); } } public class Test{ public static void main(String[] agrs){ new Zi(); } }
其运行结果如下:
Fu constructor code..9 fu constructor run zi show ..0 zi constructor code ...8 zi constructor 8当在main函数中创建子类对象时,先去加载父类,先将父类的num显式初始化为9(默认初始化为0最先执行),然后执行构造代码块,打印出内容。然后执行父类的无参构造方法,注意当调用show()方法时,因为子类也有show()方法,就去执行了子类的show(),但是由于子类的num仅仅被默认初始化为0,所以打印出的结果为 zi show .. 0。当执行完父类的构造方法后,进入子类执行显式初始化,此时,子类的num被赋值为8,并又执行了构造代码块,打印 zi constructor code ...8 ,最后执行完了子类的构造函数,对象创建完成。