java对象数组只存储引用,需先new数组再逐个new对象;否则元素为null,访问触发nullpointerexception。

Java 中对象数组定义的是引用容器,不是对象本身;初始化必须分两步:先创建数组空间,再逐个创建对象实例,否则访问时会触发 NullPointerException。
对象数组的声明与内存分配
声明只建立一个数组引用变量,不分配实际空间;用 new 分配数组后,每个元素默认为 null,不代表对象已存在。
-
正确写法(推荐):
Student[] students = new Student[4];—— 创建长度为 4 的数组,students[0]到students[3]全是null -
错误理解:以为
new Student[4]就自动创建了 4 个Student对象(实际没有) -
语法变体也合法但不常用:
Student students[] = new Student[4];(方括号放变量名后,语义相同)
对象数组的元素初始化方式
数组有了,但每个位置仍是空引用;必须显式为每个下标赋值一个真实对象,才能安全调用方法或访问属性。
-
逐个赋值:
students[0] = new Student("张三", 20); students[1] = new Student("李四", 21); -
循环批量初始化:
for (int i = 0; i
-
静态初始化(声明即赋值):
Student[] students = { new Student("王五", 19), new Student("赵六", 20) };—— 数组长度由大括号内对象个数决定,无需写new Student[2]
常见错误与注意事项
对象数组最容易踩的坑,都集中在“null”上。没初始化就用,程序立刻崩溃。
- 调用
students[i].getName()前,必须确保students[i] != null,否则抛出空指针异常 - 不能混用动态和静态初始化:
Student[] s = new Student[3]{"a","b","c"};是非法语法(长度和元素不可共存) - 字符串字面量可直接赋给
String[]元素(如names[0] = "Alice"),因为字符串字面量会自动转为String对象 - 自定义类对象数组,务必检查构造逻辑是否完整(比如
Student构造器是否接收全部必要参数)
对比基本类型数组,抓住关键区别
这是理解对象数组的核心:基本类型数组存的是值,对象数组存的是地址。
-
int[] nums = new int[3];→nums[0]默认是0,可直接参与计算 -
Student[] stu = new Student[3];→stu[0]默认是null,不能直接调stu[0].getAge() - 基本类型数组元素自动初始化;对象数组元素需手动初始化——这个差异决定了编码顺序和健壮性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











