子類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