java成员变量、代码块、构造器的初始化顺序

发布时间 2023-12-16 21:35:39作者: Deltadeblog

(1)初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;

(2)初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;

(3)初始化父类的普通成员变量和代码块,按照在程序中出现的顺序初始化,再执行父类的构造方法;

(4)初始化子类的普通成员变量和代码块,按照在程序中出现的顺序初始化,再执行子类的构造方法;

注意“按照在程序中出现的顺序初始化”,静态成员变量和静态代码块,谁在前先初始化谁。成员变量和代码块,也是谁在前先初始化谁。

public class Fruit {
    static {  // 父类静态代码块
        new Printer("fruitStaticBlock");
    }

    // 父类静态成员变量
    public static Printer fruitStaticPrinter = new Printer("fruitStaticPrinter");

    // 父类成员变量
    public Printer fruitPrinter = new Printer("fruitPrinter");

    public Fruit(){ // 父类构造器
        new Printer("FruitConstructor");
    }

    { // 父类代码块
        new Printer("Fruit Block");
    }
}

public class Apple extends Fruit{
    // 子类静态成员变量
    public static Printer appleStaticPrinter = new Printer("appleStaticPrinter");

    static { // 子类静态代码块
        new Printer("appleStaticBlock");
    }

    public Apple() { // 子类构造器
        new Printer("AppleConstructor");
    }

    { // 子类代码块
        new Printer("Apple Block");
    }

    // 子类成员变量
    public Printer applePrinter = new Printer("applePrinter");
}

public class Printer {
    public Printer(String msg) {
        System.out.println(msg);
    }
}
new Apple();

输出结果:

fruitStaticBlock
fruitStaticPrinter
appleStaticPrinter
appleStaticBlock
fruitPrinter
Fruit Block
FruitConstructor
Apple Block
applePrinter
AppleConstructor