Java 数组的声明:理解引用变量和实际对象

作者:袖梨 2026-06-25
Java数组声明的关键在于区分“数组变量”(栈中null引用)和“数组对象”(堆中连续内存),前者仅声明引用,后者才分配实际存储空间并决定长度不可变。

Java 中数组的声明,关键在于分清“数组变量”和“数组对象”不是一回事——前者是栈里的引用,后者是堆里实实在在的一块连续内存。

数组变量只是个地址“标签”

声明一个数组变量,比如 int[] arr;,只做了两件事:在栈内存中分配一个空间,存一个地址;这个地址初始值是 null。它本身不包含任何数字,也不占用堆内存。就像写了一张便签纸写着“待查收快递”,但快递还没发货。

  • 局部数组变量(如方法内声明)一定在栈上
  • 成员数组变量(类中声明)默认值也是 null(未初始化)
  • 即使声明了 String[] names;,names 也只是一个空指针,不能调用 names.length

数组对象才是真正的数据容器

只有执行 new int[5]new String[]{"a","b"} 这类操作时,JVM 才会在堆内存中划出一块连续区域,存下 5 个 int 默认值(0)或 2 个字符串引用。这时才算真正“有了数组”。

  • 数组长度一旦确定,不可改变(这是对象本身的属性)
  • 数组对象里每个元素,如果是基本类型就直接存值;如果是引用类型(如 String),就存对应对象的地址
  • 数组对象可以被多个变量共同指向,修改其中一个变量看到的内容,另一个也能感知到

常见混淆点:初始化 ≠ 声明

很多人说“数组必须初始化”,其实指的是“数组变量要指向一个有效的数组对象”,而不是给变量本身赋值。例如:

立即学习“Java免费学习笔记(深入)”;

  • int[] a = new int[3]; —— 声明 + 创建对象 + 变量指向
  • int[] b; b = new int[3]; —— 先声明变量,后创建对象并赋值
  • int[] c = {1,2,3}; —— 等价于 new int[]{1,2,3},仍是创建对象
  • int[] d = null; —— 合法声明,但 d 没指向任何数组对象

小心两类典型异常

理解变量与对象分离,能一眼看出问题根源:

  • NullPointerException:对 null 数组变量调用操作,比如 d.length 或 d[0] = 5;
  • ArrayIndexOutOfBoundsException:数组对象存在,但访问越界,比如 a[5](a 长度为 3)

相关文章

精彩推荐