"数组元素有默认值,局部变量没有"是基础规则,但 char 数组的默认值到底是什么、多维数组只分配外层时内层到底是什么状态,这篇真实跑一遍确认。
上一篇:浮点数精度真实验证
用 new 创建数组但不赋值,直接打印每种类型的默认元素值。
ArrayDefaultValueDemo.java int[] intArr = new int[3]; boolean[] boolArr = new boolean[3]; double[] doubleArr = new double[3]; char[] charArr = new char[3];
int[] 默认值: [0, 0, 0] boolean[] 默认值: [false, false, false] double[] 默认值: [0.0, 0.0, 0.0] char[] 默认值(数字形式): 0(真实是'\u0000'空字符,不是'0') Object[] 默认值: [null, null, null]
真实结果确认了每种基本类型都有一个真实、确定的零值作为数组元素默认值:数值类型是 0(或 0.0),boolean 是 false,引用类型是 null。char 类型最容易被搞错——它的默认值是 Unicode 空字符 '\u0000',强制转换成 int 后真实是数值 0,不是字符 '0'(字符 '0' 的真实 Unicode 数值是 48)——如果直接打印 char[] 数组,默认值在控制台上通常表现为不可见字符,而不是数字字符串。
这是两条完全不同的语言规则,容易被混为一谈。
局部变量不会有默认值(编译器强制要求先赋值才能使用),但数组元素会——这是真实的语言规则差异
Java 的多维数组本质是"数组的数组",如果只分配了外层,内层元素的默认值遵循引用类型规则——是 null,不是自动分配好的空数组。
ArrayDefaultValueDemo.java int[][] partial = new int[3][]; // 只分配外层,内层维度留空 System.out.println(partial[0]); int x = partial[0][0]; // 会怎样?
int[3][] 只分配外层,partial[0] 真实是: null 访问未分配的内层数组真实抛出 NullPointerException int[2][2] 完整分配后 full[0][0] 真实默认值: 0
真实结果印证了"多维数组是数组的数组"这个本质:int[3][] 的元素类型是 int[],这是一个引用类型,所以每个未分配的元素真实默认值就是 null,直接访问 partial[0][0] 真实会像访问任何 null 引用一样抛出 NullPointerException。只有当内层维度也真实被分配(new int[2][2]),内层数组的元素才会按照基本类型规则拿到默认值 0。
每一行都是真实运行这段代码得到的结果。