(一)java学习---初始化模块
初始化模块可以与构造方法一起用于初始化对象。初始化模块是用一个大括号括住的语句块,它的作用是,当多个构造方法共享一段代码时,可以提取共享代码放到初始化模块来简化类,调用时期是在当类被载入时,先执行静态初始化模块,再执行实例化模块,然后执行构造方法。
1.第一次使用类时,需要装入类,装入分为两个阶段
1.1装入父类。在装入任何类之前,如果父类没有装入,必须装入父类。这是一个递归的过程,直到继承链上的父类已经装入为止。
1.2类装入内存之后,她的静态数据域和静态初始化模块按他们在类中出现的顺序执行。
2.调用类的构造方法分为三个阶段
2.1 调用父类的构造方法,只是一个递归过程知道父类为java.lang.Object为止
2.2初始化实例数据域按他们在类中出现的顺序执行。
2.3执行构造方法的方法体
事例
public class InitializationDemo{ InitializationDemo(){ new M(); } public static void main(String[] args){ new InitializationDemo(); } { System.out.println("(2) InitializationDemo's instance initialization block"); } static{ System.out.println("(1) InitializationDemo's static initialization block"); } } class N{ N(){ System.out.println("(6) N's constructor body"); } { System.out.println("(5) N's instance initialization block"); } static { System.out.println("(3) N's static initialization block"); } } class M extends N{ M(){ System.out.println("(8) M's constructor body"); } { System.out.println("(7) M's instance initialization block"); } static { System.out.println("(4) M's static initialization block"); } }
执行结果是
(1) InitializationDemo's static, block (2) Initializati onDemo' s instanceblock (3) N's static initialization block (4) M's static initialization block (5) N's instance initialization block (6) N'S constructor body (7) M's instance initialization block(8) M's constructor body
初始化模块的执行顺序:
1、第一次使用类时先将类载入内存,
如果类的父类没有载入内存则先将父类载入内存,这是一个递归过程,直到继承链上所有的父类都载入到内存中
当载入每个类时,类的静态数据域和静态初始化模块按照它们在类中出现的先后顺序执行(即,当载入类时,立即执行类的静态数据域和静态初始化模块)
2、载入完类,从最后的子类开始,顺着继承链执行实例化模块
3、执行构造方法
如果类的父类没有实例化,则先构造父类。这也是一个递归过程,直到继承链上所有的父类都构造好。
当构造每类时,按照类中出现的先后顺序执行实例数据域跟实例初始化模块
最后执行类的构造函数