首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 自定義動態陣列容器:構造函數重載與 this() 鏈式調用深度解析

     編輯:程式設計綜合問答

問題代碼對比


// 錯誤嘗試:編譯通過,運行報 NullPointerException
public class IntArray2 {
    int[] save;
    public IntArray2(int initLen) {
        save = new int[save.length]; // save 尚未初始化,save.length 拋 NPE
    }
}

// 正確寫法:兩個構造函數,無參委託有參
public class IntArray2 {
    int[] save;
    public IntArray2() { this(10); }          // 無參構造 -> 委託預設容量 10
    public IntArray2(int initLen) {           // 有參構造:真正初始化
        if (initLen < 0) throw new IllegalArgumentException();
        save = new int[initLen];
    }
}

核心知識點

1. 域初始化順序

Java 物件創建流程:

  1. 分配記憶體,域賦預設值 (`save = null`)。
  2. 執行構造函數體。

錯誤代碼在構造函數體中讀取 `save.length`,此時 `save` 仍為 `null` → NPE。

2. 構造函數重載與 `this(...)` 委託

  • this(...) 必須是構造函數第一條語句。
  • 實現「預設值集中管理」:無參構造委託有參構造,避免重複初始化邏輯。
  • 可定義任意多個重載,只要參數列表不同(個數、類型、順序)。

3. 實參與構造函數匹配規則


new IntArray2();      // 匹配無參構造 -> this(10) -> 有參構造(10)
new IntArray2(20);    // 直接匹配有參構造(20)
new IntArray2(0);     // 匹配有參構造(0) -> 拋異常 (依實現)

「實參傳或不傳不影響結果」是因為無參構造內部委託了固定值 10,若需無參時用 0,應改為 this(0)。

完整可用動態陣列實現


public class IntArray2 {
    private int[] data;
    private int size = 0;
    
    public IntArray2() { this(16); }           // 預設容量 16
    public IntArray2(int capacity) {
        if (capacity < 0) throw new IllegalArgumentException("Capacity < 0");
        data = new int[capacity];
    }
    
    public void add(int value) {
        ensureCapacity(size + 1);
        data[size++] = value;
    }
    
    private void ensureCapacity(int minCap) {
        if (minCap > data.length) {
            int newCap = Math.max(data.length * 2, minCap);
            data = Arrays.copyOf(data, newCap);
        }
    }
    
    public int get(int index) { checkIndex(index); return data[index]; }
    public int size() { return size; }
    // ... 其他方法
}

避坑檢查清單

  • [ ] 構造函數中先初始化域,再使用域。
  • [ ] `this(...)` / `super(...)` 必須是第一行。
  • [ ] 重載構造函數參數列表必須不同。
  • [ ] 考慮提供靜態工廠方法替代複雜構造:`static IntArray2 of(int... vals)`。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved