Java二维数组传参与方法返回数组索引取值的疑问解析
Java示例代码运行逻辑逐点解析
public static void main(String[] args) { int[][] array = {{1, 2, 3, 4}, {5, 6, 7, 8}}; System.out.println(m1(array)[0]); System.out.println(m1(array)[1]); } public static int[] m1(int[][] m) { int[] result = new int[2]; result[0] = m.length; result[1] = m[0].length; return result; }
1. 方法传参的匹配逻辑
- 首先明确类型匹配规则:
array的声明类型是int[][](二维整型数组),和m1方法定义的形参int[][] m类型完全一致,不存在类型不匹配的问题。 - 认知偏差中误以为代码会把array的第一行元素传给m1,本质是混淆了传参的写法:如果要传二维数组的第一行,写法必须是
array[0](这本身是一个一维int数组),如果真这么写,反而会因为类型和形参int[][]不匹配报编译错误。 - 代码中写的
m1(array)是直接把整个二维数组对象的引用传入方法,形参m只是这个二维数组的引用别名。Java中数组是引用类型,方法传参传递的是数组对象的引用拷贝,不会把数组的所有元素值复制后传入方法,形参m和外部的array指向内存中同一份二维数组数据,不存在截取部分元素传入的情况。
2. 完整程序的逐行运行流程
- 程序启动进入
main方法,首先初始化二维数组array:这个数组外层包含2个元素(两个一维数组),第一个一维数组内容为[1,2,3,4],第二个为[5,6,7,8]。 - 执行第一个打印语句
System.out.println(m1(array)[0]):- 将
array的引用传入m1方法 m1方法内部初始化长度为2的一维数组result- 给
result[0]赋值为m.length:因为m指向的二维数组外层元素个数是2,所以result[0] = 2 - 给
result[1]赋值为m[0].length:m[0]是二维数组的第一行一维数组,长度为4,所以result[1] =4 m1方法将填充好的result数组返回,直接取返回数组0号索引位置的值2打印到控制台
- 将
- 执行第二个打印语句
System.out.println(m1(array)[1]):- 此处会重新调用一次
m1方法,不会复用第一次调用的返回值:方法内部会新建一个全新的result数组,重复上述赋值逻辑,得到同样的[2,4]数组 - 直接取新返回数组1号索引位置的值
4打印到控制台
- 此处会重新调用一次
- 最终控制台会依次输出两行内容:
2、4
3. 直接对方法返回值做索引的语法规则
- Java运算符优先级中,方法调用运算符
()和数组索引运算符[]属于同一优先级,运算顺序为从左到右。 - 对于表达式
m1(array)[0],JVM会按照固定顺序执行:先运行左侧的方法调用m1(array),拿到方法返回的int[]类型数组引用,再对这个引用执行[0]索引取值。 - 这个语法完全符合Java规范,不需要额外加括号写成
(m1(array))[0](加括号也不影响运行,但属于冗余写法)——正是因为优先级规则的存在,不加括号也不会出现运算顺序错乱的问题。
举个反例:如果代码写成
m1(array[0]),按照从左到右的优先级,会先计算array[0](得到第一行的一维数组)再传入m1,此时因为一维数组和方法要求的二维数组类型不匹配,就会触发编译错误,这也能佐证运算符优先级的实际作用。
内容的提问来源于stack exchange,提问作者manavi yadav
相关产品推荐
相关产品推荐

