
java中数组本身是对象,其变量存储的是对数组对象的引用;而对象数组的每个元素又可存储对其他对象的引用,形成“引用的引用”结构,但本质上仍是单层引用关系。
在Java中,所有数组都是对象,无论其元素类型是基本类型(如 int[])还是引用类型(如 String[] 或 Object[])。这意味着声明一个数组变量(例如 Object[] array)时,该变量本身并不直接持有数据,而是持有一个指向堆内存中数组对象的引用。
例如:
Object[] array = new Object[10];
这行代码执行后,内存中发生以下关键步骤:
- JVM 在堆上分配一块连续内存,用于存放一个能容纳 10 个 Object 引用的数组对象;
- 变量 array 位于栈中,其值是一个引用(即地址),指向该堆中的数组对象;
- 数组的 10 个槽位(array[0] 到 array[9])初始值均为 null —— 它们尚未指向任何实际对象,仅具备“可存储引用”的能力。
当后续执行:
立即学习“Java免费学习笔记(深入)”;
array[0] = new Object();
此时:
- JVM 在堆中创建一个新的 Object 实例;
- array[0] 这一槽位被赋予该实例的引用(即地址),从而建立起从数组元素到具体对象的连接。
⚠️ 需注意:虽然常被描述为“数组持有对象的引用”,但数组元素本身不是“对引用的引用”——它就是一个普通引用变量(类似 Object obj = ... 中的 obj),只是语法上通过下标访问。Java 中不存在 C/C++ 风格的二级指针;所谓“引用的引用”仅是语义上的形象说法,底层始终是一层引用间接寻址。
✅ 正确理解模型有助于避免常见误区:
- array 和 array[0] 是两个独立的引用变量,修改其中一个不影响另一个(除非重新赋值);
- array.clone() 创建的是浅拷贝:新数组对象独立,但其中元素引用仍指向原对象;
- array = null 仅令变量失去对数组的引用,不直接影响 array[0] 所指对象的可达性。
总之,Java 的引用机制统一而简洁:变量 →(引用)→ 堆中对象。数组作为对象,其元素只是多个并列的引用容器,理解这一点,便掌握了对象数组内存布局的核心逻辑。










