子类A继承父类B,A a=new A();
正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
也就是说非静态初始化块的执行顺序要在构造函数之前。
class FatherStaticTest { static { System.out.println("执行父类的静态代码块。"); } FatherStaticTest() { System.out.println("执行父类的不带参数的构造方法。"); } FatherStaticTest(String str) { System.out.println("执行父类的带参数的构造方法。"+str); } { int i = 1; int j = 1; int sum = (i+j); System.out.println("执行父类的构造代码块。"+sum); } } class SonStaticTest extends FatherStaticTest { static { System.out.println("执行子类的静态代码块。"); } SonStaticTest() { System.out.println("执行子类的不带参数的构造方法。"); } SonStaticTest(String str) { super(str); System.out.println("执行子类的带参数的构造方法。"+str); } { int i = 2; int j = 2; int sum = (i+j); System.out.println("执行子类的构造代码块。"+sum); } } public class SuperClass { public static void main(String[] args) { new SonStaticTest("a"); } }
执行完之后可以看到顺序如下:
执行父类的静态代码块。 执行子类的静态代码块。 执行父类的构造代码块。2 执行父类的带参数的构造方法。a 执行子类的构造代码块。4 执行子类的带参数的构造方法。a