最近想研究下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可以看到在执行构造方法之前会先给类的成员变量赋值。总之,先构造好父类,然后在父类基础上构造子类。
简单的记录下,具体的细节到需要的时候再补充。
网友评论