一 、结论
1、一个类
先后执行顺序:静态代码块 → 普通代码块 → 子类构造方法
2、子父类
当比较子父类执行顺序时:
父类静态代码块 → 子类静态代码块 → 父类普通代码块 → 父类构造方法 → 子类普通代码块 → 子类构造方法
二、代码验证
1、一个类
package taishangcode;
/**
* 公众号:taishangcode
*/
public class Child {
public Child() {
System.out.println("构造方法");
}
{
System.out.println("普通代码块");
}
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
new Child();
}
/**输出:
* 静态代码块
* 普通代码块
* 构造方法
*/
}
2、子父类
package taishangcode;
public class Father { //父类
public Father() {
System.out.println("父类构造方法");
}
{
System.out.println("父类普通代码块");
}
static {
System.out.println("父类静态代码块");
}
}
package taishangcode;
/**
* 公众号:taishangcode
*/
public class Child extends Father{ //子类
public Child() {
System.out.println("子类构造方法");
}
{
System.out.println("子类普通代码块");
}
static {
System.out.println("子类静态代码块");
}
public static void main(String[] args) {
new Child();
/*
* 输出结果:
* 父类静态代码块
* 子类静态代码块
* 父类普通代码块
* 父类构造方法
* 子类普通代码块
* 子类构造方法
*/
}
}
三、关于变量与代码块的顺序
1、静态与非静态
静态的是随着类的加载而执行,普通的则是实例化的时候执行:
静态早于普通
2、变量与代码块的执行顺序
谁先声明谁先执行:
静态变量与静态代码块谁先声明谁先执行;
普通变量与普通代码块谁先声明谁先执行;