class Test2_Extents{
public static void main(String[] args){
System.out.println("Hello World");
Zi z = new Zi();
/*
1.Jvm 调用main方法,
main方法进栈
2.遇到Zi z = new Zi(),会现将Fu.class和Zi.class分别加载进内存,在创建对象,当Fu.class加载进内存 父类的静态代码块会随着Fu.class一起加载,当Zi.class加载进内存,子类的静态代码块儿会随着Zi.class一起加载 静态代码块Fu,第二个输出静态代码块Zi
3.走Zi类的构造方法,因为在Java中是分成初始化的,先初始化父类,在初始化子类,所以先走的父类构造,但是在执行父类构造的时候,发现父类有构造代码块,构造代码块儿是优先于构造方法执行的所以 第三个输出构造代码块Fu,第四个输出构造方法Fu
4.Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,最后输出构造方法Zi
*/
}
}
class Fu{
static{
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu(){
System.out.println("构造方法Fu");
}
}
class Zi extends Fu{
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi(){
System.out.println("构造方法Zi");
}
}