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!");
}
}
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 static
son static
father class test
father constructor!
son class test
main constructor!