声明数组仅创建栈中引用变量且值为null,未分配堆内存;必须通过new或大括号初始化才能使用length和元素,长度一旦确定不可变,jvm自动完成默认初始化,匿名数组适用于一次性传参场景。

声明只是起个名字,不分配内存
写 int[] arr; 或 String[] names; 只是在栈上创建一个引用变量,此时值为 null。它没指向任何对象,不能访问 length,也不能读写元素——否则运行时抛 NullPointerException。
常见误解是“声明完就能用”,其实这只是占了个名分,还没分配空间。必须后续用 new 实例化,或用大括号一次性完成初始化。
实例化决定长度,且不可更改
执行 arr = new int[5]; 才真正触发堆内存分配:连续开辟 5 个 int 单元(共 20 字节),所有元素自动设默认值 0(boolean 是 false,引用类型是 null)。
- 数组长度由 new 指定,一旦确定就不能扩容或缩容
- length 是数组对象的属性(不是方法),是获取长度的唯一安全方式
- 跳过实例化直接用 arr.length 会编译失败或运行时报空指针
初始化分静态、动态和默认三种
静态初始化:声明时用大括号赋初值,如 int[] a = {1, 2, 3};。编译器推导长度,生成等效的 new int[]{1,2,3} 字节码。大括号必须紧跟在声明后,不能拆开或延迟。
动态初始化:先 new int[4] 分配空间并填默认值,再用循环或逐个赋值,例如:
for (int i = 0; i
默认初始化 发生在实例化时,JVM 自动填充基本类型默认值或引用类型 null,无需代码干预。
匿名数组适合一次性传参
像 Arrays.asList(new String[]{"a", "b", "c"}) 中的 new String[]{"a","b","c"} 就是匿名数组——没有变量名,生命周期绑定当前表达式。
- 不能赋给已声明但未初始化的变量(除非类型匹配且尚未赋值)
- 常用于方法调用、Stream 构造、集合转换等场景
- 底层仍是标准数组,遵守下标从 0 开始、内存连续等规则
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











