JAVA類的各種成員初始化順序如:父子類繼承時的靜態代碼塊,普通代碼塊,靜態方法,構造方法,等先后順序
class B extends A , 然后 A 類也就是父類里面有靜態代碼塊,普通代碼塊,靜態方法,靜態成員變量,普通成員變量,普通方法。 子類也是這樣,然后繼承之后,關于程序打印輸出的結果。 涉及到 Java 類的各種成員的初始化順序。 經測試,得到如下結論:
- 1、父類【靜態代碼塊】和【靜態成員】,按在代碼中出現的順序依次執行。
- 2、子類【靜態代碼塊】和【靜態成員】,按在代碼中出現的順序依次執行。
- 3、父類的【普通代碼塊】和【普通成員變量被普通成員方法賦值】,按在代碼中出現的順序依次執行。
- 4、執行父類的構造方法。
- 5、子類的【普通代碼塊】和【普通成員變量被普通成員方法賦值】,按在代碼中出現的順序依次執行。
- 6、執行子類的構造方法。
下面看測試代碼以及測試結果的圖:
父類:
package com.test.ClassInitTest;
public class Parent {
static {
System.out.println("父類: 靜態代碼塊");
}
{
System.out.println("父類: 普通代碼塊");
}
private static String staticStringInParent = initStaticStringInParent();
private String stringInParent = initStringInParent();
public Parent() {
System.out.println("父類: 構造方法");
}
private static String initStaticStringInParent() {
System.out.println("父類:靜態方法,被靜態成員變量賦值調用。");
return "initStaticStringInParent";
}
private String initStringInParent() {
System.out.println("父類:普通成員方法,被普通成員變量賦值調用。");
return "initStringInParent";
}
}
子類:
package com.test.ClassInitTest;
public class Child extends Parent {
private static String staticStringInChild = initStaticStringInChild();
private String stringInChild = initStringInChild();
static {
System.out.println("子類:靜態代碼塊");
}
{
System.out.println("子類:普通代碼塊");
}
public Child() {
System.out.println("子類:構造方法");
}
private static String initStaticStringInChild() {
System.out.println("子類:靜態方法,被靜態成員變量賦值調用。");
return "initStaticStringInChild";
}
private String initStringInChild() {
System.out.println("子類:普通成員方法,被普通成員變量賦值調用。");
return "initStringInChild";
}
}
測試 main 方法
package com.test.ClassInitTest;
public class ClassInitTest {
public static void main(String[] args) {
System.out.println("測試代碼開始");
new Child();
System.out.println("測試代碼結束");
}
}
結果輸出:
測試代碼開始
父類: 靜態代碼塊
父類:靜態方法,被靜態成員變量賦值調用。
子類:靜態方法,被靜態成員變量賦值調用。
子類:靜態代碼塊
父類: 普通代碼塊
父類:普通成員方法,被普通成員變量賦值調用。
父類: 構造方法
子類:普通成員方法,被普通成員變量賦值調用。
子類:普通代碼塊
子類:構造方法
測試代碼結束
作者:老周聊架構
來源:稀土掘金
鏈接:
https://juejin.cn/post/6952750370598682660版權聲明: 內容來源網絡,僅供分享學習,版權歸原創作者所有,除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除表示歉意。謝謝!