java读程序,然后分析过程和结果,提供必要的文字说明

读程序,然后分析过程和结果,提供必要的文字说明

public class Test {
    public static void main(String[] args) {
        Sub sub = new Sub();
    }
}
class Base{
    static {
        System.out.println("base 静态代码块");
    }
    {
        System.out.println("base 构造代码块");
    }
    public Base(){
        System.out.println("base无参构造");
    }
}
class Sub extends Base{
    static {
        System.out.println("sub 静态代码块");
    }
    {
        System.out.println("sub 构造代码块");
    }
    public Sub(){
        //super()
        System.out.println("sub 无参构造");
    }
}

1、首先要知道静态代码块执行顺序高于构造代码块高于构造函数
2、子类的构造方法中默认有 super()

首先,JVM调用了main方法,mian方法进栈,此时遇到Sub sub = new Sub()这句语句,会将Base.class和Sub.class分别加载进内存,之后才会创建对象。我们知道,静态代码块的执行优先于对象的创建,也就是说当Base.class加载进内存时,父类的静态代码块会随着Base.class一起加载,然后是Sub.class加载进内存,而与此同时子类的静态代码块也会随着Sub.class一起加载进内存。接下来就是进入子类的构造方法了,然后你以为就直接打印子类的构造方法里的输出了吗,你太天真了,要知道java是分层初始化的,先初始化父类,才初始化子类(你爸爸始终还是你爸爸,得先有你爸爸才有你,这是一个道理)。然后,还有注意构造代码块优先于构造方法执行的,所以第三个输出的是父构造代码块,第四个输出的是父构造方法,而后才是子类的初始化。