| 數組類型 | 默認值 | 備註 |
|---|---|---|
| byte / short / int / long | 0 / 0L | 整數類型統一為 0 |
| float / double | 0.0f / 0.0d | 浮點類型統一為 0.0 |
| char | '\u0000' (空字符) | 非可見字符 |
| boolean | false | 唯一非數值類型 |
| 所有引用類型 (Object, String, 自定義類, 陣列等) | null | 指向無對象 |
Java 虛擬機在分配數組內存時,會自動將內存區域清零。這是 JVM 規範強制要求的安全機制,防止使用未初始化的隨機內存數據(C/C++ 常見漏洞來源)。
public class ArrayDefaultValueDemo {
public static void main(String[] args) {
// 1. 基本類型數組
int[] intArr = new int[3];
double[] doubleArr = new double[2];
boolean[] boolArr = new boolean[2];
System.out.println("int[0] = " + intArr[0]); // 0
System.out.println("double[0] = " + doubleArr[0]); // 0.0
System.out.println("boolean[0] = " + boolArr[0]); // false
// 2. 引用類型數組
String[] strArr = new String[2];
Object[] objArr = new Object[2];
int[][] matrix = new int[2][3]; // 二維數組:外層引用默認 null,內層創建時再默認 0
System.out.println("String[0] = " + strArr[0]); // null
System.out.println("Object[0] = " + objArr[0]); // null
// 3. 方法參數傳遞驗證:基本類型數組元素按值傳遞,但數組引用本身是引用傳遞
int[] a = new int[1]; // a[0] 默認 0
modify(a);
System.out.println("修改後 a[0] = " + a[0]); // 輸出 1
}
static void modify(int[] arr) {
arr[0]++; // 修改的是堆上數組的內容
}
}
輸出結果:
int[0] = 0
double[0] = 0.0
boolean[0] = false
String[0] = null
Object[0] = null
修改後 a[0] = 1
雖然 JVM 自動清零,但大數組分配仍需時間。若明確需要特定初始值,請顯式初始化或使用 Arrays.fill()。
String[] arr = new String[5];
System.out.println(arr[0].length()); // 拋出 NullPointerException!
正確做法:先實例化元素 arr[0] = "hello"; 或使用集合 List<String>。
ArrayList 等集合類避免 NPE。new int[3][] 只初始化第一維(引用為 null),第二維需單獨 new int[4]。| 變量類型 | 是否自動默認初始化 | 使用前必須賦值 |
|---|---|---|
| 類成員變量 (字段) | 是 | 否 |
| 數組元素 | 是 | 否 |
| 方法局部變量 | 否 | 是 (編譯器強制檢查) |
注意:方法內聲明的數組引用 int[] a; 不會自動初始化,必須 new int[3] 後才能用,否則編譯報錯「variable might not have been initialized」。