java数组变量存储的是堆中数据的内存地址,而非数据本身;未初始化时值为null,访问会抛出nullpointerexception;赋值和传参均为引用共享,修改一方会影响另一方;对象数组元素需单独实例化。

Java 数组不是“装数据的盒子”,而是“指向一排储物柜的钥匙”。理解这点,数组引用和内容管理就不再混乱。
数组变量存的是地址,不是内容
声明 int[] arr 或 String[] names 时,变量本身只保存一个内存地址,指向堆中真正存放数据的那块连续空间。就像你手里的门牌号,不代表房子本身。
- 没用
new初始化前,数组变量值为null,相当于钥匙丢了——任何访问(如arr[0])都会触发NullPointerException -
int[] a = new int[3];后,a指向堆中一块能存 3 个整数的空间,每个元素默认是0 -
String[] b = new String[3];后,b指向堆中一块能存 3 个引用的空间,每个元素默认是null
多个变量可共享同一份数组
赋值语句 int[] copy = original; 不是复制数据,只是把“同一把钥匙”递给另一个人。后续通过任一变量修改元素,另一方立刻可见。
- 这是浅拷贝,本质是引用共享
- 想真正隔离数据,得用
Arrays.copyOf()、clone()或手动循环赋值 - 方法传参也是同样逻辑:传入数组参数,方法内改
nums[0] = 100,原数组对应位置同步改变
对象数组的每个槽位都是独立引用
Person[] people = new Person[5]; 这行代码只创建了 5 个“空挂钩”,没创建任何 Person 对象。每个 people[i] 都可以单独指向不同实例,也可以为 null。
-
people[0] = new Person("张三");→ 把新对象地址挂到第 0 个挂钩上 -
people[1] = people[0];→ 第 1 个挂钩也挂向同一个对象,此时两个索引指向同一实例 - 修改
people[0].setName("李四"),people[1].getName()也会变成“李四”——因为它们挂的是同一个对象
初始化与使用必须严格区分
数组必须先“分配空间”,再“填内容”。跳过初始化直接用,是初学者最常踩的坑。
- 静态初始化:
int[] arr = {1, 2, 3};—— 编译器自动new并赋值 - 动态初始化:
String[] arr = new String[3];—— 空间有了,但每个元素是null,需逐个赋值 - 声明不等于定义:
int[] arr;只是声明变量,arr还是null,不能用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











