类初始化执行顺序

2022-01-19  本文已影响0人  喏喏2021
  1. 这里的执行顺序主要包括如下几个点:
  1. 直接上实例
//基类
class Base {
    private static int a = 1; //基类静态变量,
    private int b = 2; //基类成员变量
        //基类代码块
    {
        System.out.println("a="+a+",b="+b);
        System.out.println("基类代码块1");
    }
        //基类静态代码块
    static {
        System.out.println("a="+a);
        System.out.println("基类静态代码块2");
    }
        //基类代码块2,主要演示两个代码块的执行顺序
    {
        System.out.println("基类代码块2");
    }
        //基类构造方法
    Base(){
        System.out.println("基类初始化");
    }
}
//子类
class Sub extends Base {
    {
        System.out.println("子类代码块1");
        //System.out.println("d="+d); //因为变量在后面定义,这里还不能引用到,会有如下编译错误Cannot reference a field before it is defined
    }
    static {
        System.out.println("子类静态代码块");
        //System.out.println("c="+c);//静态变量也需要放在前面Cannot reference a field before it is defined
    }
    private static int c = 3; //子类静态成员变量
    private int d = 4; //子类成员变量
    Sub(){
        System.out.println("子类初始化");
    }
    {
        System.out.println("子类代码块2");
    }
}

public class ClassInitTest {
    public static void main(String[] args) {
        Sub sub = new Sub();
        Sub sub1 = new Sub(); //定义两次,主要看静态代码是否还会执行
    }
}

输出结果:

a=1   //基类静态成员
基类静态代码块2  //基类静态代码块
子类静态代码块  //子类静态代码块
a=1,b=2  //基类实例变量
基类代码块1 //基类代码块
基类代码块2
基类初始化  //基类构造方法
子类代码块1 //子类代码块
子类代码块2
子类初始化 //子类构造方法
a=1,b=2   //第2次初始化,与静态相关的,就没有什么关系了
基类代码块1
基类代码块2
基类初始化
子类代码块1
子类代码块2
子类初始化
  1. 总结
    总体执行顺序如下:
    1)基类静态成员变量、基类静态代码块 (按代码前后)
    2)子类静态成员变量、子类静态代码块(按代码前后)
    3)基类实例变量、代码块 (按代码前后)
    4)基类构造方法
    5)子类实例变量、代码块(按代码前后)
    6)子类构造方法
上一篇下一篇

猜你喜欢

热点阅读