「基本類型在棧,對象在堆」不完全正確。更精確的描述:
String[] names = {"Michael", "Orson", "Andrew"}; // names: 棧上引用 → 堆上 String[3] 對象
String[] animal = new String[4]; // animal: 棧上引用 → 堆上 String[4] 對象
names = animal; // names 引用指向 animal 所指對象,原 String[3] 變為垃圾
System.out.println(names.length); // 4
System.out.println(animal.length); // 4
關鍵點:數組大小不可變,但引用變量可指向不同大小的數組對象。賦值只是複製引用,不複製對象。

names 指向長度 3 數組,animal 指向長度 4 數組。String[] arr = {"Michael", "Orson"}; // "Michael" 是 String 對象,在堆
// 字面量 "Michael" 在常量池(堆的一部分),arr[0] 引用指向它
基本類型局部變量(如 int age = 10;)確在棚;但作為對象字段或數組元素時,隨對象在堆。
class Animal { String name; int age; }
Animal[] animals = new Animal[2]; // animals: 引用 → 堆 Animal[2](元素均 null)
Animal cat = new Animal("cat", 1); // cat: 引用 → 堆 Animal 對象
Animal dog = new Animal("dog", 2);
animals[0] = dog; // animals[0] 引用指向 dog 所指對象
animals[1] = cat;
dog.info(); // dog 引用調用方法 → 真正操作堆上對象
animals[0].info(); // 同一對象,輸出相同

animals[0] = dog 只是複製引用,不創建新對象。names = animal 後,原 String[3] 無 GC Root 可達,下次 GC 回收。-Xmx -Xms 設定堆大小,配合 -XX:+PrintGCDetails 觀察數組分配回收行為。