Java中数组变量是引用类型,存储在栈中,指向堆中连续内存的起始地址;赋值和传参为地址拷贝,修改元素影响原数组,重定向引用则互不影响;length是数组对象的final字段,不可修改,越界访问抛ArrayIndexOutOfBoundsException。

Java 中没有指针,所谓“数组与指针的关系”其实是对引用机制的误读。一维数组变量本身是引用类型,它不存数据,只存地址;真正数组内容(包括所有元素)全部放在堆内存里。
数组变量只是栈里的一个地址
声明 int[] arr = new int[5]; 时,arr 这个变量在栈中,只占几个字节,里面存的是堆中那块连续 5 个 int 空间的起始地址。你不能像 C 那样对 arr 做 arr + 1 运算,因为 Java 不暴露内存偏移细节,也不允许算术操作。
赋值和传参都是地址拷贝
执行 int[] b = arr; 或把 arr 传进方法,不是复制 5 个 int 的值,而是把那个地址再复制一份。结果是 arr 和 b 指向堆中同一块内存——改 b[0],arr[0] 也会变。
- 修改元素:影响原数组(因共享堆内存)
- 重定向引用:比如 b = new int[3];,只改变 b 的指向,arr 不受影响
- 传参后在方法内 nums = new int[10];,不会改变调用方的数组引用
length 是数组对象的 final 字段
每个数组对象在堆中都自带一个 length 字段,它是 public、final 的整数,记录创建时确定的长度。这个值不可修改,也不存在“动态扩容”——想变长,只能新建数组并复制元素。
立即学习“Java免费学习笔记(深入)”;
注意:arr.length 访问的是对象属性,不是调用方法,所以快且安全;越界访问(如 arr[5])会在运行时抛 ArrayIndexOutOfBoundsException,由 JVM 直接检查索引是否
多维数组本质是“引用的引用”
虽然常写成 int[][] matrix,但它其实是 int[] 类型的一维数组,每个元素又是 int[] 引用。也就是说,matrix 在堆中是一块引用数组,它的每个位置存的不是数字,而是另一个数组的地址。
- matrix.length 是行数(即外层数组长度)
- matrix[0].length 是第一行的列数,其他行可以不同(不规则数组)
- 如果 matrix[1] == null,访问 matrix[1][0] 会抛 NullPointerException
不复杂但容易忽略:Java 数组的“引用性”贯穿始终——从声明、赋值、传参到异常机制,全由堆中对象 + 栈中地址这一套模型决定。


















