简要记录类的加载执行顺序:
先说结论:
父类静态(块/变量)–>子类静态(块/变量)–>父类普通(变量/块)–>父类构造器–>子类普通(变量/块)–>子类构造器
具体执行过程:
- 程序先找到main函数,不管此时有没有使用new进行创建对象,都会将涉及到的类(例如父类)进行类加载;
- 发现Son类有一个父类Father类;
- 初始化有关Father类的静态变量与静态块(顺序依据书写的顺序执行);
- 初始化有关Son类的静态变量与静态块(顺序依据书写的顺序执行);
- 全部静态初始完毕,以上过程都是创建对象之前执行,且仅执行一次;
- 创建Son类对象son1;
- 初始化父类普通块与普通变量(顺序依据书写的顺序执行);
- 初始化父类构造器;
- 初始化子类普通块与普通变量(顺序依据书写的顺序执行);
- 初始化子类构造器;
- Son类对象son2同son1;
父类:
package test.loadSort;
public class Father {
public static String str1 = println("父类静态变量1");
static {
//System.out.println("父类静态块2");
println("父类静态块2");
}
{
println("父类普通块1");
}
public String str2 = println("父类普通变量2");
public static String str3 = println("父类静态变量3");
public Father() {
println("父类构造器3");
// System.out.println("父类构造器5");
}
public static String println(String str) {
System.out.println(str);
return str;
}
}
子类:
package test.loadSort;
public class Son extends Father{
public static String str1 = println("子类静态变量1");
{
println("子类普通块1");
}
public String str2 = println("子类普通变量2");
static {
//System.out.println("父类静态块2");
println("子类静态块2");
}
public Son() {
println("子类构造器3");
// System.out.println("父类构造器5");
}
public static String str3 = println("子类静态变量3");
public static void main(String[] args) {
System.out.println("--------静态只执行一次--------");
Son son1 = new Son();
System.out.println("*******普通根据new次数执行*********");
Son son2 = new Son();
}
}
执行结果:
父类静态变量1
父类静态块2
父类静态变量3
子类静态变量1
子类静态块2
子类静态变量3
--------静态只执行一次--------
父类普通块1
父类普通变量2
父类构造器3
子类普通块1
子类普通变量2
子类构造器3
*******普通根据new次数执行*********
父类普通块1
父类普通变量2
父类构造器3
子类普通块1
子类普通变量2
子类构造器3