java怎么传实参,参数传递由形参传递给实参
首先,明确Java中方法参数传递的规则很重要。这两点是:
如果参数是基本类型(包括包装器类型)或字符串,则参数不会改变(值被传递);如果参数是对象的集合或数组,参数将会改变(它是一个引用)。以上两篇比较简单,我就不展开了。在这里,我只说一件事。很多人会践踏方法中引用的传递,如下:
我们以一个数组为例。下面的代码是几行简单的代码。你能猜到最后的输出是什么样的吗?
public class PassByValueDemo { public static void main(String[]args){ int[]I={ 0 };新的PassByValueDemo()。演示(一);//这个地方还是0 system . out . printf(arrays . tostring(I));} public void Demo(int[] i){ //这个参数是一个数组,它是一个引用。它的价值会变吗?马鞭马鞭Nonono,只是在这个方法中改变了,仍然{0}回到主方法堆栈中。i=new int[]{1,2,3 };system . out . println(arrays . tostring(I));}}根据第二条规则,如果实参是对象集或者数组,实参会变(引用传递)。大家很容易认为这个参数是一个数组,但是引用传递了,它的值就会发生变化。这是一个大错误。这只会在方法中短暂地更改数组的值,它将返回到主方法堆栈或{0}。实际输出如下:
[1,2,3][0]进程结束,退出代码为0
为什么会这样?具体分析如下:
我们来看main方法中的第一行操作int [] i={0}。这个操作将在内存中打开一个4字节的内存空间,然后返回数组的第一个地址。假设数组的第一个地址值是0x1111,那么I指向内存中的一个空间0x1111。0存储在存储器地址为0x1111的空间中;继续往下看,调用Demo方法。此时会保存mian方法栈的状态,包括mian方法中I指向的内存空间。这里点很重要,很重要,很重要,重要的事情说三遍。在演示方法new Int[] {1,2,3}中,这个操作会再次在内存中打开一个空间,然后返回数组第一个地址的值。我们假设地址值是0x2222,内存是0x222,存储1,2,3;此时I的值指向0x2222;那么此时输出I,当然会打印出1,2,3;执行完演示方法后,让我们回到主方法。此时,就在进入演示方法之前保存的堆栈信息从虚拟机堆栈中恢复。在进入演示方法之前,我指向了0x1111,它已经保存在堆栈中的局部变量表中(请参考作者的这篇博文:点击我)。现在,我们把它拿出来,然后我指向0x1111而不是0x2222。它是在这个时候印刷的。虽然我们不能改变引用地址,但我们可以改变引用所指向的地址空间中的值,如下所示:
public class PassByValueDemo { public static void main(String[]args){ int[]I={ 0 };新的PassByValueDemo()。演示(一);system . out . printf(arrays . tostring(I));} public void Demo(int[]I){ I[0]=1;system . out . println(arrays . tostring(I));} }输出结果:
[1][1]进程结束,退出代码为0
熟悉C或C的同学可以用int *const(允许改变存储在地址中的值)的类比来代替int const*(允许指针指向其他地址)。
Java 形参和实参的区别:
参数:是一个形参,用来定义一个方法。它用于接收调用者传递的参数。参数只有在调用方法时,虚拟机才会分配内存单元,调用方法后释放分配的内存单元。因此,形参只在方法内部有效,所以对被引用对象的更改不会影响方法外部。
参数:实际参数,用于在调用时传递给方法。参数在被传递给其他方法之前被预先赋值。在这个例子中,numa、交换方法数量是形式参数,传递给交换方法的a和b是实际参数。
注意:在传值调用的过程中,只能将参数传递给参数,不能将参数的值反向传递给参数。在函数调用过程中,形参的值会改变,但实参的值不会改变。在引用调用的机制中,实参引用的地址实际上是传递给形参的,所以任何发生在形参上的变化也会发生在实参变量上。
总结
关于Java的踩坑方法中的形参和实参传递的这篇文章到此为止。关于Java中形参和实参传递的更多信息,请搜索popular IT以前的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。