Java中声明数组仅定义引用变量且值为null,动态分配需用new指定长度并开辟堆内存,二者不可混淆;推荐int[] arr;声明后arr = new int[5];分配,或直接int[] arr = new int[5];一步完成。

Java中声明数组、初始化和动态分配空间是三个紧密关联但必须分清的步骤。跳过任一环节,比如只声明不分配空间,运行时就会报 NullPointerException;而混淆声明与创建,又容易写出编译错误的代码。
怎么正确声明一个数组变量
声明只是告诉编译器“我要用一个数组”,并不占用内存,也不确定长度。语法有两种写法,但推荐使用第一种:
- int[] numbers; ✅ 推荐——类型+方括号在前,语义清晰:这是一个“整型数组”类型的引用变量
- int numbers[]; ⚠️ 兼容C风格,不推荐,易误读为“numbers 是 int 类型的数组名”,实际它仍是引用类型
此时 numbers 的值是 null,不能访问 numbers.length 或 numbers[0],否则直接崩溃。
如何动态分配数组空间(实例化)
用 new 关键字在堆上开辟连续内存,并指定元素个数。这一步才真正创建数组对象:
立即学习“Java免费学习笔记(深入)”;
-
numbers = new int[5]; —— 分配 5 个
int空间,每个默认为0 -
String[] names = new String[3]; —— 分配 3 个
String引用空间,每个默认为null
注意:数组长度一旦确定就不能改变。想“扩容”,只能 new 一个更大的新数组,再手动复制旧数据。
声明 + 动态分配 + 初始化的常用组合写法
实际编码中,多数情况会把声明和 new 合并,一步到位:
- int[] scores = new int[10]; —— 声明并分配空间,所有元素初始为 0
- double[] prices = new double[7]; —— 同理,每个元素默认为 0.0
- 之后可用循环赋值:
for (int i = 0; i
这种写法避免了 null 引用问题,也符合 Java 编码习惯。
静态初始化 vs 动态初始化的区别
两者都完成声明+分配+赋值,但适用场景不同:
-
静态初始化:已知全部初始值,且数量固定
char[] vowels = {'a', 'e', 'i', 'o', 'u'};或int[] data = new int[]{10, 20, 30};
数组长度由大括号内元素个数自动决定 -
动态初始化:只知道长度,具体值后续计算或输入
boolean[] flags = new boolean[100];→ 所有元素自动设为false
匿名数组(如 new int[]{1,2,3})只用于临时传参,不能单独存在,也没有变量名。


















