执行顺序
父类静态变量 or 父类静态代码块[看位置,顺序执行,从上往下]
子类静态变量 or子类静态代码块[看位置,顺序执行,从上往下]
父类非静态变量 or 父类非静态代码块[看位置,顺序执行,从上往下]
父类构造方法
子类非静态变量 or 子类非静态代码块[看位置,顺序执行,从上往下]
子类构造方法
注:
静态代码块只执行一次
因为static修饰的在类被加载时也被加载 (https://www.cnblogs.com/lwthad/p/10253322.html)
public class CLazzExecutionOrder {
public static void main(String[] args) {
System.out.println("main方法开始执行了");
System.out.println("===============================");
Son son = new Son();
System.out.println("===============================");
Son son1 = new Son();
System.out.println("===============================");
System.out.println("main方法执行完成了");
}
}
class Father {
// 代码顺序靠前,越早执行;
private String name = setName() ;
{
System.out.println("执行父类的普通代码块");
}
// 静态代码块 和静态变量,和代码顺序有关,代码顺序靠前,越早执行;
private static int age = setAge();
static{
System.out.println("执行父类的静态代码块");
}
public Father() {
System.out.println("执行父类的构造方法");
}
private String setName() {
System.out.println("执行父类普通变量的赋值");
return "Bob";
}
private static int setAge() {
System.out.println("执行父类静态变量的赋值");
return 233244;
}
}
class Son extends Father{
private int no = setNo();
private int setNo() {
System.out.println("执行子类普通变量的赋值");
return 9527;
}
private static int num = setNum();
private static int setNum() {
System.out.println("执行子类静态变量的赋值");
return 118;
}
static{
System.out.println("执行子类的静态代码块");
}
{
System.out.println("执行子类的普通代码块");
}
public Son() {
System.out.println("执行子类的构造方法");
}
}
执行顺序
main方法开始执行了
===============================
执行父类静态变量的赋值
执行父类的静态代码块
执行子类静态变量的赋值
执行子类的静态代码块
执行父类普通变量的赋值
执行父类的普通代码块
执行父类的构造方法
执行子类普通变量的赋值
执行子类的普通代码块
执行子类的构造方法
===============================
执行父类普通变量的赋值
执行父类的普通代码块
执行父类的构造方法
执行子类普通变量的赋值
执行子类的普通代码块
执行子类的构造方法
===============================
main方法执行完成了
参考:https://blog.csdn.net/weixin_42324471/article/details/95943537