中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java項目中如何使用對象初始化順序

發布時間:2020-11-17 14:55:44 來源:億速云 閱讀:139 作者:Leah 欄目:編程語言

Java項目中如何使用對象初始化順序?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一、 代碼塊的概念

在探究對象初始化順序之前,我們先通過代碼來了解一下代碼塊的概念。

class Test{
  public static String str1; //靜態字段

  public String str2;     //普通字段

  static{           
    //靜態代碼塊
  }

  {
    //構造代碼塊
  }

  public Test() { 
    //構造函數
  }
}

二、 創建子類對象時,對象的初始化順序

1. 字段初始化、代碼塊和構造函數的執行順序

我們先看代碼和結果

public class CodeBlockTest {
  public static void main(String[] args) {
    Child child = new Child();
  }
}
class Father {
  public static String fatherStr1 = "fatherStr1(靜態字段初始化值)";

  public String fatherStr2 = "fatherStr2(字段初始化值)";
  static {
    System.out.println("父類靜態代碼塊:" + fatherStr1);
    fatherStr1 = "fatherStr1(靜態代碼塊賦值)";
  }
  {
    System.out.println("父類構造代碼塊:" + fatherStr2);
    fatherStr2 = "fatherStr2(構造代碼塊賦值)";
  }
  public Father() {
    System.out.println("父類構造函數塊:" + fatherStr2);
    fatherStr2 = "fatherStr2(構造函數賦值)";
  }
}
class Child extends Father {
  public static String childStr1 = "childStr1(靜態字段初始化值)";
  public String childStr2 = "childStr2(字段初始化值)";
  static {
    System.out.println("子類靜態代碼塊:" + childStr1);
    childStr1 = "childStr1(靜態代碼塊賦值)";
  }
  {
    System.out.println("子類構造代碼塊:" + childStr2);
    childStr2 = "childStr2(構造代碼塊賦值)";
  }
  public Child() {
    System.out.println("子類構造函數:" + childStr2);
    childStr2 = "childStr2(構造函數賦值)";
  }
}
//  輸出結果:
//  父類靜態代碼塊:fatherStr1(靜態字段初始化值)
//  子類靜態代碼塊:childStr1(靜態字段初始化值)
//  父類構造代碼塊:fatherStr2(字段初始化值)
//  父類構造函數塊:fatherStr2(構造代碼塊賦值)
//  子類構造代碼塊:childStr2(字段初始化值)
//  子類構造函數:childStr2(構造代碼塊賦值)

通過每執行一個代碼塊或構造函數,輸出字段在上一代碼塊執行后的值,以此來探究對象的初始化順序。

由目前的輸出結果可知,對于對象的初始化順序,我們可以得出以下結論:

1. 父類靜態字段初始化

2. 父類靜態代碼塊、子類靜態字段初始化 (接下來探究兩者的順序)

3. 子類靜態代碼塊

4. 父類普通字段初始化

5. 父類構造代碼塊

6. 父類構造函數

7. 子類普通字段初始化

8. 子類構造代碼塊

9. 子類構造函數

2. 父類靜態代碼塊和子類靜態字段初始化的執行順序

還是一樣,我們通過代碼的執行結果來探究兩者間的執行順序。

public class CodeBloacTest2 {
  public static void main(String[] args) {
    Child child = new Child();
  }
}
class Father {
  public static String fatherStr = "(靜態字段初始化值)";
  static {
    System.out.println("父類靜態代碼塊:fatherStr" + fatherStr);
    fatherStr = "(靜態代碼塊賦值)";
  }
}
class Child extends Father {
  public static String childStr = fatherStr;
  static {
    System.out.println("子類靜態代碼塊:childStr = fatherStr" + childStr);
    childStr = "(靜態代碼塊賦值)";
  }
}
//  輸出結果:
//  父類靜態代碼塊:fatherStr(靜態字段初始化值)
//  子類靜態代碼塊:childStr = fatherStr(靜態代碼塊賦值)

我們在子類靜態字段childStr初始化的時候,賦的是父類靜態字段fatherStr的值。由輸出結果可知,childStr初始化后的值是父類靜態代碼塊執行后賦予fatherStr的值。由此可知兩者的執行順序為:父類靜態代碼塊==>子類靜態字段初始化

三、 結論

父類靜態字段初始化

父類靜態代碼塊

子類靜態字段初始化

子類靜態代碼塊

父類普通字段初始化

父類構造代碼塊

父類構造函數

子類普通字段初始化

子類構造代碼塊

子類構造函數

通過結論我們可以很明顯的看出:static字段、代碼塊的執行順序優先于非static字段、代碼塊。這是因為在靜態域是屬于類的,在類加載后就一直存在;而普通域需要創建對象才能訪問。而在創建對象時,需要先加載父類,然后再加載子類,因此父類的靜態字段初始化和靜態代碼塊執行先于子類。

看完上述內容,你們掌握Java項目中如何使用對象初始化順序的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平塘县| 辽源市| 渭南市| 西乌珠穆沁旗| 武宣县| 东方市| 蓬溪县| 辽源市| 湟源县| 锡林浩特市| 闸北区| 泸西县| 依安县| 海兴县| 平度市| 自治县| 台南市| 林口县| 海宁市| 衡东县| 高青县| 仪陇县| 阆中市| 平邑县| 阜南县| 怀来县| 永靖县| 信宜市| 彭泽县| 斗六市| 易门县| 江阴市| 德阳市| 保定市| 获嘉县| 静宁县| 汤阴县| 龙门县| 武宣县| 昂仁县| 元朗区|