静态代码块、构造代码块、构造方法的执行顺序及注意问题

首先先看一段代码:


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(),有的话在其之后执行,最后执行构造方法的方法体

(有理解不对的地方还请大家指点,一起交流探讨)

你可能感兴趣的:(静态代码块、构造代码块、构造方法的执行顺序及注意问题)