通过简单的代码,更清晰的了解了,一个类的实例化顺序
/** * 测试实例化父类 */ public class ParentInstance { public ParentInstance() { System.out.println("父类构造方法"); this.print(); } { System.out.println("父类构造代码块"); } static { System.out.println("父类静态代码块"); } public void print() { System.out.println("父类打印方法"); } }
/** * 测试实例化子类 */ public class SonInstance extends ParentInstance { public SonInstance() { System.out.println("子类构造方法"); this.print(); } { System.out.println("子类构造代码块"); } static { System.out.println("子类静态代码块"); } public void print() { System.out.println("子类打印方法"); } public static void main(String[] args) { System.out.println("子类main()方法"); new SonInstance(); } }
结果如下:
父类静态代码块
子类静态代码块
子类main()方法
父类构造代码块
父类构造方法
子类打印方法
子类构造代码块
子类构造方法
子类打印方法
由于父类打印方法被子类覆盖,因此尽管父类调用的是this.print(),但最终还是调用子类的打印方法。
总结如下:
父类静态代码块>子类静态代码块>子类main()方法>父类构造代码块>父类构造方法>子类构造代码块>子类构造方法
静态代码块:在虚拟机加载类的时候就会加载执行,而且只执行一次。
非静态代码块:在创建对象的时候执行,每次创建对象都会执行一次。