Java多维数组重分配疑问:为何B、E选项无编译运行问题?
Java多维数组类型匹配问题解析
先看给定的Java代码:
double myArray [][][] = new double [3][][]; double d = 100.0; double [][] myArray2 = new double [1][1];
问题
以下哪两项不会导致编译或运行时错误?(选2项)
选项:
- A. myArray [0] = d;
- B. myArray [0] = myArray2;
- C. myArray [0] = myArray2 [0];
- D. myArray2 [1][1] = d;
- E. myArray2 = myArray [0]
已知正确答案是B和E,下面逐个分析选项,并重点解释二者维度匹配的核心逻辑:
选项逐一分析
- 选项A:
myArray[0]的类型是double[][](二维数组),而d是double基本类型,类型完全不匹配,直接编译报错。 - 选项B:
myArray是三维数组,它的每个元素(比如myArray[0])本质是一个double[][]类型的二维数组引用;myArray2本身就是double[][]类型的二维数组,二者类型完全一致,赋值操作合法,无编译或运行时错误。 - 选项C:
myArray2[0]的类型是double[](一维数组),但myArray[0]需要的是double[][](二维数组),类型不匹配,编译报错。 - 选项D:
myArray2是new double[1][1],数组索引从0开始,myArray2[1]已经超出了数组的有效索引范围(仅索引0可用),运行时会抛出数组越界异常。 - 选项E:
myArray[0]的类型是double[][](二维数组),myArray2的类型同样是double[][](二维数组),类型匹配,赋值合法。虽然此时myArray[0]还未初始化(仅声明了三维数组的第一层空间,第二层未分配),但Java允许将未初始化的同类型数组引用赋值给变量,赋值操作本身不会报错(后续若未初始化就使用myArray2才会出问题,但赋值步骤是合规的)。
核心维度匹配逻辑
Java的多维数组本质是数组的数组:
double[][][]代表“存储二维数组的数组”,所以它的每一个元素(比如myArray[0]),都是一个double[][]类型的二维数组引用。double[][]代表“存储一维数组的数组”,也就是标准的二维数组。
因此 myArray[0] 和 myArray2 属于完全相同的数组类型,自然可以互相赋值,这就是B、E选项合法的根本原因。
内容的提问来源于stack exchange,提问作者TylerBalaskovitz
相关产品推荐
相关产品推荐

