对象的初始化顺序: 首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕以后,再去看父类有没有非静态代码块,若是有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕以后,它接着去看子类有没有非静态代码块,若是有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,而后执行子类非静态代码块和构造方法。java
public class F_Test { { System.out.println("father not_static"); } static { System.out.println("father static"); } public F_Test(){ System.out.println("father constructed"); } } public class S_Test extends F_Test { { System.out.println("son not_static"); } static { System.out.println("son static"); } public S_Test(){ System.out.println("son constructed"); } public static void main(String[] args) { new S_Test(); } } //将输出 father static son static father not_static father constructed son not_static son constructed
注意: 子类的构造方法,无论这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。若是父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,不然编译不能经过。web
public class F_Test { { System.out.println("father not_static"); } static { System.out.println("father static"); } public F_Test(String name){ System.out.println("father constructed"+"【"+name+"】"); } } public class S_Test extends F_Test { public S_Test(String name) { super(name); } { System.out.println("son not_static"); } static { System.out.println("son static"); } public static void main(String[] args) { new S_Test("Supper"); } }