前言
想学好Java,就必须要弄明白值传递的来龙去脉,话不多说,这一章节,直接用例题说明这个关键点!!!
一、例题引入
例题:问,以下代码输出结果是什么?
public class work8 {
public static void main(String[] args) {
int i = 99;
mb_operate(i);
System.out.println(i + 100);
}
static void mb_operate(int j) {
j+=100;
}
}
正确答案:
199!!!当你觉得这道题的答案是299的时候,你要仔细看这篇文章啦!!!
二、值传递和引用传递?
1.概念
(1)值传递
值传递是指将参数的值复制一份,然后将这份副本传递给方法或赋值给新的变量。在值传递中,方法或函数无法直接修改原始变量的值,因为它们操作的是参数的副本。在值传递中,如果在方法内部修改了参数的值,那么只会影响到方法内部的副本,而原始变量的值保持不变。
换句话说:
在传值的时候,把原件保留,复印件给传出去,然后接下来的操作一直都针对复印件,比如这道题,把复印件给mb_operate方法里了,他就只操作复印件,碰不到原件,而在上面的输出语句中的 i 是操作的原件,所以mb_operate方法对于最终的结果并没有什么改变,这道题的结果是199.
(2)引用传递
引用传递是指将参数的引用(内存地址)传递给方法或赋值给新的变量。在引用传递中,方法或函数可以通过引用访问和修改原始变量的值。在引用传递中,方法对参数的修改会直接影响到原始变量的值。因为方法操作的是原始变量的引用,所以对引用的修改会反映到原始变量上。
换句话说:
引用传递的时候传的不是复印件,传的是地址,也可以理解成原件的一种,在方法中进行一系列的操作,还是会操作到原件身上。
三、怎么解决值传递中遇见的问题
那么这道题里主要考查的是java中的值传递,换句话说,i 和 j 分别在两个方法中,分别是两个局部变量,井水不犯河水,如果这道题需要等于299的话,那么就只能将方法mb_operate加一个int型的返回值,把反馈回来的 j 再次赋给 i ,否则不能等于299。
那么我们就用一段代码来看一下怎么才能让这道题的结果等于299.
public class Test1 {
public static void main(String[] args) {
int i = 99;
i = mb_operate(i);
System.out.print(i + 100);
}
static int mb_operate(int j) {
int m = j;
j += 100;
return j;
}
}
进行二次赋值,用返回回来的复印件上的值,把原件的东西覆盖掉
运行结果:
总结
以上个人对于值传递和引用传递的见解,本文用一道例题,巧妙地解释了Java中的值传递机制,但是一定不要将值传递和引用传递混淆,大家自己试着理解值传递,也欢迎大家在评论区积极讨论,希望这篇文章可以帮助到你!