普通变量传参
在 Java中,一个方法可以选择需要参数或者无需参数,当方法需要参数时,传入参数都发生了什么变化是一个非常值得研究的问题,由此而来,我已自己所学来简单讲解一下其中的机制。
实例 1
这是一个交换两个数值的方法,方法传入了两个形参 a 和 b,交换之后并打印出来。
class MethodA {
public void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a: " + a + ", b: " + b);
}
}
思考一下,假如在 main 方法中调用了此方法,该方法会改变原有 main 方法中变量的值吗?
我们将它使用一下看看是什么效果
public class AA {
public static void main(String[] args) {
int a = 10;
int b = 20;
MethodA ma = new MethodA();
System.out.printf("MethodA方法中");
ma.swap(a,b);
System.out.println("main方法中 a="+a+" b="+b);
}
}
运行完成之后发现结果如下:
诶?这是应该我们会发出疑问,我们不是在swap 方法中交换了两个变量的值吗?怎么输出 ab 值还是没有变?
为了更好的理解其中的传参机制,我粗略的画个图解释一下
在内存中,main 方法和 swap 方法位于栈中的不同空间,当在 main 方法中调用 swap 方法后,a 和 b 作为形参传到 swap 的空间,在 swap 方法空间中完成了数值交换,但是 main 方法中的 a 和 b 并没有发生转换,所以才会出现运行结果与我们所想的不同。
引用变量传参
上面解释了普通变量传参的机制,接下来讲讲引用变量传参机制。
实例2
class MethodB {
public void Print(int[] arr)
{
arr[0] = 20;
for(int i = 0; i < arr.length; i++)
{
System.out.print(arr[i] + " ");
}
System.out.println("");
}
}
我们以输出一个数组为例,为了能够掩饰出方法改变了数组的值,将数组第一个值改为 20,下面我们来使用这个方法
public class Jiou {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
MethodB b = new MethodB();
System.out.printf("Print 方法输出的数组\n");
b.Print(arr);
System.out.println("main方法中输出的数组" );
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
运行结果如下:
我们发现经过 Print 方法改变之后,数组的第一个值确实发生了改变,并且这个改变应用到了 main 方法中。我们发现这与普通变量传参并不一样。下面我也用简单的图解释一下
我们知道引用变量其实是引用了堆里的一串地址,当 Print 方法需要参数时,其实是将数组的地址传入了,并且修改了地址中的数值,而 main 方法中的数组也引用相同的地址,这就导致 main 方法中的数组也发生了变化。
总结
简单的讲了讲传参机制的一些细节,希望你能理解
标签:传参,arr,Java,int,System,机制,main,方法,out From: https://blog.csdn.net/weixin_70432322/article/details/142437363