学习整理——Java类初始化顺序

来源:互联网 发布:变频器编程教程软件 编辑:程序博客网 时间:2024/06/10 07:39

Java类初始化顺序是一道典型的面试笔试题目,经常会遇到。由于记忆力不好,所以总是忘记刚学习的知识,简单验证一下增加印象。


先说结论

一个类被引入以及被创建实例,类内部执行的顺序是:父类静态变量、代码块——>子类静态变量、代码块——>父类成员变量、代码块——>父类构造方法——>子类成员变量、代码块——>子类构造方法。


总结

1.所有关于静态的数据、代码需要先被执行,包括父类和子类的;

2.一个进程里同一个类的静态区域只能被执行或初始化一次,然后所有该类的实例共享该静态区域;

3.接着是类的普通成员变量、代码块,不像C/C++,Java每一个基本数据类型在声明时如果不赋值都会有默认值。如果声明了变量则在此刻得到初始化,类似于C++的初始化列表。成员变量间的初始化顺序按照类定义时的顺序执行;

4.最后就是调用对应的构造函数;

5.以上顺序,在对比父类子类时,都是先父类再子类,父类会追溯到Object类。


验证

先编写一个用作普通成员初始化的类MemberClass,该类只在构造函数里输出信息:

public class MemberClass {public MemberClass(String arg){System.out.println( arg + " class test");}}

创建一个父类FatherClass,分别加入静态代码区、普通成员变量MemberClass:

public class FatherClass {static{System.out.println("father static");}MemberClass memberTest = new MemberClass("father");public FatherClass(){System.out.println("father constructor!");}}


创建一个子类,继承FatherClass,同理也分别加入静态代码区、普通成员变量MemberClass。最后在子类上加入程序入口,该程序只做一件事,就是实例化一个该子类。

public class SonClass extends FatherClass{static{System.out.println("son static");}private MemberClass memberTest = new MemberClass("son");public SonClass(){System.out.println("main constructor!");}public static void main(String[] arg){SonClass sonInstance = new SonClass();}}


运行输出

father staticson staticfather class testfather constructor!son class testmain constructor!









0 0