工作生活

类的实例化顺序

2019-07-02  本文已影响0人  QuickLearn

最近想研究下spring源码,发现类的实例化顺序都忘光了还研究个毛线。因此写了个简单的Demo记录下。
大概的思路是,子类继承父类,当new一个子类时,会先实例化父类,然后实例化子类。看起来就像子类包裹着父类,子类有父类全部的“基因”,同时又有自己的特点。
父类Father:

public class Father {

    private static final int f1 = 1;

    private int f2 = 2;

    static {
        System.out.println("this is father's static block");
    }

    public Father() {
        System.out.println("father's  default constructor");
    }

    public Father(int i) {
        System.out.println("father's constructor with  param");
    }
}

子类Son 继承Father


public class Son extends  Father {

    private static final int s1 = 1;

    private int s2 = 2;

    static {
        System.out.println("this is son's static block");
    }


    public Son() {
        System.out.println("son's default constructor");
    }

    public Son(int i) {
        super(i);
        System.out.println("son's constructor with param");
    }

    public static void main(String[] args) {
        new Son(1);
    }
}

首先要分清类的加载和实例化。
类的加载:相当于把class(也就是制造对象的模板)加载到JVM中。可以这样理解,一些静态不变的东西(static代码块,static变量)是归属于class的,因此类的加载阶段执行一次就好了。当我们new一个Son时,会触发类的加载(就是把Father,son这两个类加载到JVM)。此时会执行静态代码块。输出如下:


this is father's static block
this is son's static block

类的实例化:然后真正开始“制作”Son的实例:


father's constructor with  param
son's constructor with param


可以看到首先执行父类构造方法,然后子类构造方法。通过debug可以看到在执行构造方法之前会先给类的成员变量赋值。总之,先构造好父类,然后在父类基础上构造子类。

简单的记录下,具体的细节到需要的时候再补充。

上一篇 下一篇

猜你喜欢

热点阅读