Java中对象数组内存分配分两层:栈存引用,堆存数组结构及对象引用;数组本身是对象,需new创建,元素初始为null,须单独初始化。
![java中 对象数组 person[] 怎么分配内存空间](https://img.php.cn/upload/article/001/242/473/178409908160165.jpeg)
Java中对象数组(如 Person[])的内存分配分两层:栈中存引用,堆中存实际数组结构和对象引用——数组本身是对象,必须用 new 在堆中创建;数组里的每个元素初始为 null,需单独 new Person() 初始化。
声明与数组对象创建(堆中分配数组容器)
执行类似 Person[] people = new Person[5]; 时:
- JVM 在堆内存中分配一块连续空间,用于存放 5 个
Person类型的引用槽位(不是 Person 对象本身) - null,不占用额外对象内存
- people 仅保存指向该数组对象的地址(例如
0xabc123) - length 字段,长度固定不可变
单个对象实例化(堆中逐个创建 Person 实例)
数组容器建好后,要让某个位置真正持有 Person 对象,必须显式创建:
-
people[0] = new Person();→ 在堆中新建一个Person实例,把它的地址填入数组第 0 号槽位 -
people[2] = new Person("张三", 25);→ 同理,调用构造方法初始化并赋值 - people[1].getName(),会抛出
NullPointerException
静态初始化写法(本质仍是两步合并)
像 Person[] people = {new Person("李四", 30), new Person("王五", 28)}; 这种写法:
立即学习“Java免费学习笔记(深入)”;
- new Person(...),把生成的对象地址填入对应槽位
- new Person[2] 再逐个赋值,只是语法更紧凑
常见误区提醒
注意这几个典型错误:
-
Person[] people; people = {new Person(), ...};→ ❌ 编译失败,花括号初始化只能出现在声明语句中 -
Person[] people = new Person[3]; System.out.println(people[0].getName());→ ❌ 运行时报空指针,因为people[0]是null - new Person[3] 创建了 3 个 Person 对象 → ❌ 实际只建了数组容器,共 0 个 Person 实例


















