先贴代码:
class Fu{
static{
System.out.println("父类静态代码块");
}
{
System.out.println("父类构造代码块");
}
public Fu(){
System.out.println("父类构造方法");
}
}
class Zi extends Fu {
static{
System.out.println("子类静态代码块");
}
{
System.out.println("子类构造代码块");
}
public Zi(){
System.out.println("子类构造方法");
}
}
public class Test {
public static void main(String[] args) {
Zi zi=new Zi();
}
}
首先能肯定的是静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载
编译时,先加载父类,所以Fu类的静态代码块首先执行,而后加载Zi类,Zi类的静态代码块执行
然后创建Zi的对象,大家都知道构造代码块优先于构造方法执行,这时候问题来了,这时应该先看Zi类的构造方法,Zi类里的构造方法里有一句隐式的super()首先被执行,所以找到Fu类的构造方法,而Fu类的构造方法中也有一句隐式的super()执行(调用Object类的构造方法),并没有什么返回结果,接下来才是在执行Fu类构造方法的方法体前先执行了Fu类的构造代码块,再执行Fu类构造方法的方法体,最后又回到Zi类的构造方法中,这时Zi类的super()已经执行完了,在执行Zi类构造方法的方法体前先执行Zi类的构造代码块,再执行Zi类构造方法的方法体
所以执行结果为:
父类静态代码块
子类静态代码块
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法