动态初始化指用new明确指定数组长度,jvm自动填充默认值:基本类型为0、0.0、'\u0000'、false,引用类型为null;局部变量未初始化会编译报错,字段未new则引用为null。

动态初始化:先分配空间,再填值
动态初始化的核心是用 new 明确指定数组长度,适用于运行时才知道大小的场景。例如读取用户输入的个数、从配置读取容量、或根据计算结果决定数组尺寸。
写法统一为:
数据类型[] 数组名 = new 数据类型[长度];
- 长度可以是常量(
new int[5]),也可以是变量(int n = 3; new double[n]) - 创建后数组立即在堆上分配连续内存,所有元素自动填充默认值——这个过程由 JVM 完成,无需手动赋值或调用构造器
- 后续可通过下标逐个赋值,如
arr[0] = 100;,或用循环批量设置
基本类型元素的默认值很确定
只要执行了 new,JVM 就会在内存清零阶段统一写入默认值,不依赖任何代码逻辑。这些值是语言规范强制定义的:
-
int、short、byte、long→ 0 -
float、double→ 0.0f、0.0 -
char→ '\u0000'(Unicode 空字符,ASCII 为 0,不是空格) -
boolean→ false
这意味着 int[] a = new int[3]; 创建的是 {0, 0, 0},无需额外初始化即可安全读取数值。
引用类型元素默认为 null,使用前必须检查
String[]、Object[]、自定义类数组等,其每个元素初始值都是 null,不是空对象,也不是新实例。
-
String[] words = new String[2];→words[0] == null且words[1] == null - 直接调用
words[0].length()会抛出NullPointerException - 必须显式赋值对象引用,如
words[0] = "hello";或words[1] = new StringBuilder();
尤其注意泛型擦除限制:不能写 new ArrayList<string>[3]</string>,只能写 new ArrayList[3],此时每个元素仍是 null,需单独初始化。
局部变量与字段的区别要分清
数组引用本身的初始化行为,取决于它声明的位置:
- 类中定义的数组字段(如
private String[] cache;),未new时引用值为 null(不是元素为 null,是整个数组没创建) - 方法内定义的局部数组变量(如
String[] temp;),若未执行temp = new String[2];,编译直接报错:“variable temp might not have been initialized” -
final数组字段也一样:必须在构造器或实例初始化块中完成new操作,否则编译失败
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











