Java方法参数传递机制原理解析
这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参。
这就涉及到Java中的参数传递机制,值传递。
基本数据类型
基本数据类型,值传递的体现是数值的传递。
publicclassTransferTempTest{ publicstaticvoidmain(String[]args){ //基本数据类型参数传递 TransferTempTesttest=newTransferTempTest(); intnum1=10; intnum2=20; System.out.println("进行交换前:"); System.out.println("num1="+num1+",num2="+num2); test.swap(num1,num2); System.out.println("交换之后:"); System.out.println("num1="+num1+",num2="+num2); } publicvoidswap(inta,intb){ inttemp=a; a=b; b=temp; System.out.println("交换过程中:"); System.out.println("num1="+a+",num2="+b); } }
//运行结果 进行交换前: num1=10,num2=20 交换过程中: num1=20,num2=10 交换之后: num1=10,num2=20
整个过程的内存图演示:
如图所示:
- 在堆内存中创建TransferTempTest类型的对象,假设此时地址值时0x1177(只是假设),并让栈内存中的引用变量test存储0x1177,指向该对象。
- 在栈内存中声明两个变量num1和num2,并为他们赋值10和20。这时可以看到打印的结果为:num1=10,num2=20
- 程序继续向下,进入swap方法,首先在栈区声明两个变量a和b,他们都是形参,这时将num1和num2的值分别传入,此时如蓝色字体所显示,a=10,b=20。
- 接着还是在栈区声明一个名为temp的变量,这时执行的交换过程是在swap方法中,交换的变量其实是num1和num2的拷贝值,所以方法内打印:num1=20,num2=10
- 最后,退出这个方法,局部变量销毁,发现其实一顿操作,原先的值根本就没有改变,打印结果和原先一样:num1=10,num2=20
引用数据类型
基本数据类型,值传递的体现是地址值的传递。
publicclassTransferTempTest{ publicstaticvoidmain(String[]args){ //引用类型参数传递 DataTempdata=newDataTemp(); data.a=2; data.b=4; System.out.println("进行交换前:"); System.out.println("data.a="+data.a+",data.b="+data.b); data.swapClass(data); System.out.println("进行交换后:"); System.out.println("data.a="+data.a+",data.b="+data.b); } } classDataTemp{ inta; intb; publicvoidswapClass(DataTempdata){ inttemp=data.a; data.a=data.b; data.b=temp; System.out.println("交换过程中:"); System.out.println("data.a="+data.a+",data.b="+data.b); } }
//运行结果 进行交换前: data.a=2,data.b=4 交换过程中: data.a=4,data.b=2 进行交换后: data.a=4,data.b=2
整个过程的内存图显示:
如图所示:
- 在堆内存中创建DataTemp类型的对象,并让栈内存中的引用变量data存储0x7788(假设地址值),指向该对象,实例变量a和b的初始值都是0。
- 让data.a=2,data.b=4,如蓝色字体显示,这时打印:data.a=2,data.b=4
- 进入swapClass方法,首先在栈区声明形参变量data,将原来的data的地址值传入,红黑两个data不是同一个!!,红色data只是黑色data的拷贝值,且拷贝的是地址值。这时两个data指向同一片堆区内存,如红色箭头显示。
- 接着还是在栈区声明一个名为temp的变量,参与交换操作,这时操作的是堆区的数据,所以方法里显然打印:data.a=4,data.b=2
- 最后,退出这个方法,局部变量销毁,执行的交换过程虽然是在swapClass方法中,但引用变量传入形参传递的是地址值,意味着,这时的交换操作直接对堆区对象生效,所以最终交换成立:data.a=4,data.b=2
综合练习
packagecom.my.pac05; publicclassTransferTest{ publicstaticvoidmain(String[]args){ TransferTesttest=newTransferTest(); test.first(); } publicvoidfirst(){ inti=5; Valuev=newValue(); v.i=25; second(v,i); System.out.println(v.i); } publicvoidsecond(Valuev,inti){ i=0; v.i=20; Valueval=newValue(); v=val; System.out.println(v.i+""+i); } } classValue{ inti=15; }
//运行结果 150 20
整个过程的内存图显示:
总结
- 方法不能修改基本数据类型的参数,他们改变的仅仅是他们的拷贝。
- 方法可以改变对象参数的状态,因为方法可以通过对象引用的拷贝修改对象状态。
- 方法不能让对象参数引用一个新的对象,方法得到的永远都是拷贝值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。