首先先看一段代码:
class Dad{
static {
System.out.println("Dad static code");
}
{
System.out.println("Dad code");
}
public Dad(){
System.out.println("Dad GouZao");
}
}
class Son extends Dad{
static {
System.out.println("Son static code");
}
{
System.out.println("Son code");
}
public Son (){
System.out.println("Son GouZao");
}
}
public class Text{
public static void main(String[] args) {
Son son = new Son ();
}
}
1,在编译Text.java时,先加载了Dad类,因此Dad类的静态代码块首先执行,而后加载Son类,Son类的静态代码块执行,这没什么好说的
2,然后创建Son的对象,大家都知道构造代码块优先于构造方法执行,这时候问题来了,这时应该先看Son类的构造方法,Son类里的构造方法里有一句隐式的super()首先被执行,所以找到Dad类的构造方法,而Dad类的构造方法中也有一句隐式的super()执行(调用Object类的构造方法),并没有什么返回结果,接下来才是在执行Dad类构造方法的方法体前先执行了Dad类的构造代码块(Dad code),再执行Dad类构造方法的方法体(也就是Dad GouZao),最后又回到Son类的构造方法中,这时Son类的super()已经执行完了,在执行Son类构造方法的方法体前先执行Son类的构造代码块(Son code),再执行Son类构造方法的方法体(Son GouZao)
最后的结果是:
Dad static code
Son static code
Dad code
Dad GouZao
Son code
Son GouZao
不知道大家绕晕了没有,我在这再总结一下:静态的是与类有关,肯定先加载,而构造代码块执行前要先看构造方法中是否有this()或super(),有的话在其之后执行,最后执行构造方法的方法体
(有理解不对的地方还请大家指点,一起交流探讨)