关于java中方法或者函数,形参,实参的个人理解

本文通过一个简单的加法运算示例,介绍了Java中方法的基本概念及其如何被调用执行的过程。作者分享了从困惑到理解的心路历程,并解释了形参与实参的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在自学java中,总是对方法感到困惑,总觉得,只要方法写了,程序就会执行,后来在看某位老师的java教学视频后,突然醍醐灌顶,勉强算是开窍了,下面就写写自己的理解吧。

比如,我想算1+2=?,也想算21+32,25+22...,方法可以这样写

void  total(int a,int b){
int sum = a+b;
System.out.println(a+"+"+b+"="+sum);
}

a,b 为形参

在main函数中,这样写

类名 引用=new 该类的构造函数;

total(1,2);

其中,1,2为实参

这时方法才开始运行

只有方法被调用了才执行,一般情况下


<think>好的,我现在要解决用户关于Java中二维数组作为形参实参的影响机制的问题。首先,我需要回忆Java数传递机制。记得Java数传递都是值传递,基本类型传递的是值的副本,而引用类型传递的是引用的副本。那二维数组属于引用类型,所以当它作为数传递时,实际上传递的是数组引用的副本。 接下来,我需要确定二维数组的结构。二维数组在Java中实际上是数组的数组,也就是说,每个外层数组的元素是一个内层数组的引用。因此,当传递二维数组给方法时,形参实参会指向同一个外层数组对象。但形参本身是一个副本,这个副本存储的是外层数组的引用。 然后,需要考虑修改形参实参的影响。如果方法内部修改了形参指向的外层数组的元素(比如修改某个内层数组的引用),由于形参实参引用的副本,这种修改会影响实参,因为它们指向同一个外层数组。例如,如果方法中执行了array[0] = new int[3],那么实参的对应位置也会改变。但是,如果在方法内部将形参重新指向一个新的二维数组,比如array = new int[2][3],这不会影响实参,因为此时形参的引用副本指向了新对象,而实参仍然指向原来的对象。 另外,如果方法内部修改的是内层数组的元素,比如array[0][0] = 5,这同样会影响实参,因为内层数组的引用并未改变,只是元素值被修改了,而实参形参仍然共享这些内层数组的引用。 需要验证这些理解是否正确。查看用户提供的引用,比如引用[1]提到Java是值传递引用传递共存,但本质是值传递。这说明传递的是引用的副本,而不是引用本身。引用[4]中的JNI例子也展示了二维数组作为数传递时,如何获取数组元素,进一步支持了二维数组作为引用传递的机制。 可能用户混淆的地方在于,容易认为传递的是引用本身,导致方法内对形参的任何修改都会反映到实参,但实际上只有修改引用指向的对象内容才会影响实参,而改变形参的引用指向不会影响实参。需要明确区分修改引用指向的对象修改引用本身。 总结起来,回答的结构应该是先解释Java数传递机制,再具体到二维数组的情况,举例说明不同操作对实参的影响,并引用相关资料中的观点支持结论。最后生成相关问题,帮助用户深入理解。</think>在Java中,二维数组作为形参传递时,遵循Java的**值传递机制**,但具体表现需结合二维数组的**引用类型特性**来分析。以下是分步解释: --- ### 一、Java数传递的核心机制 1. **基本数据类型**:传递的是值的副本,形参实参内存地址独立 2. **引用类型**:传递的是对象引用的副本,形参实参指向同一个对象[^1] - 例如数组、对象等 - 对形参引用的**对象内容**修改会影响实参 - 对形参引用的**重新赋值**不会影响实参 --- ### 二、二维数组的特殊性 二维数组本质是「数组的数组」,其内存结构为: ``` int[][] arr = { {1,2}, // arr[0]指向第一个一维数组 {3,4} // arr[1]指向第二个一维数组 } ``` - 外层数组存储的是内层数组的引用 - 形参接收的是外层数组引用的副本 --- ### 三、具体场景分析 #### 场景1:修改内层数组元素 ```java void modifyElement(int[][] arr) { arr[0][0] = 99; // 修改实际存储的值 } // 调用时 int[][] myArr = {{1,2}, {3,4}}; modifyElement(myArr); System.out.println(myArr[0][0]); // 输出99 ``` **结果**:实参内容被修改,因为操作的是**共享的引用指向的对象** #### 场景2:重新分配外层数组引用 ```java void reassignOuter(int[][] arr) { arr = new int[][]{{5,6}}; // 改变形参的引用 } // 调用后 System.out.println(myArr[0][0]); // 仍输出1 ``` **结果**:实参不受影响,因为修改的是**形参的副本引用** #### 场景3:修改内层数组引用 ```java void reassignInner(int[][] arr) { arr[0] = new int[]{7,8}; // 修改外层数组元素 } // 调用后 System.out.println(myArr[0][0]); // 输出7 ``` **结果**:实参被修改,因为操作的是**共享的外层数组对象** --- ### 四、内存示意图 ``` 实参myArr → 外层数组对象 ├─ [0] → 内层数组对象A └─ [1] → 内层数组对象B 形参arr(副本)→ 外层数组对象 ``` - 对虚线框外的修改不影响实参 - 对虚线框内的修改影响实参 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值