静态块、非静态块、构造器加载顺序和加载次数

时间:2021-06-30 19:31:02

当我们new一个类的时候,则这个类静态初始化块最先运行且静态初始化块只加载一次。后面再new的时候,静态代码块就不执行了,它只在类第一次加载的时候执行一次且最先执行父类的静态初始化块。其次就是普通初始化块和构造器,普通初始化块和构造器一样,在每次创建对象的时候都要都要加载,且最先加载父类的普通初始化块和构造器。

例子如下:

父类Person

public class Person {
    //静态初始化块
    static{
        System.out.println("Person静态初始化块!");
    }
    //普通初始化块
    {
        System.out.println("Person普通初始化块!");
    }
    //构造器
    public Person(){
        System.out.println("Person构造器!");
    }
}

子类Student继承Person

public class Student extends Person{
    //静态初始化块
    static{
        System.out.println("Student静态初始化块!");
    }
    //普通初始化块
    {
        System.out.println("Student普通初始化块!");
    }
    //构造器
    public Student(){
        System.out.println("Student构造器!");
    }
}

子类Pupil继承Student

public class Pupil extends Student{
    //静态初始化块
    static{
        System.out.println("Pupil静态初始化块!");
    }
    //普通初始化块
    {
        System.out.println("Pupil普通初始化块!");
    }
    //构造器
    public Pupil(){
        System.out.println("Pupil构造器!");
    }
}

在main函数里创建两个Pupil对象

Pupil pupil = new Pupil();
System.out.println("==================================");
Pupil pupil2 = new Pupil();

控制台打印如下:

静态块、非静态块、构造器加载顺序和加载次数