首页 > 编程知识 正文

java对象是值传递还是引用传递,java方法是值传递还是引用传递

时间:2023-05-03 06:46:26 阅读:31116 作者:419

前言: java的数据类型分为基本数据类型和引用数据类型。

基本数据类型

整数: byte、short、int、long浮点类型: float、double字符类型: char布尔类型: boolean引用数据类型

数组类接口方法的参数分为实际参数和格式参数。

格式参数:定义方法时要写的参数。 实际参数:调用方法时编写的具体数值。 通常,将数据作为参数传递时,基本数据类型是传递值,而引用数据类型是传递引用(传递地址)。

传值publicstaticvoidmain (字符串[ ] args ) { int num1=10; int num2=20; swap(num1、num2); system.out.println(num1='num1); system.out.println(num2='num2); }publicstaticvoidswap(inta,int b ) { int temp=a; a=b; b=temp; system.out.println(a='a ); system.out.println(b='b ); }执行结果:

a=20b=10num1=10num2=20原因:流程:主函数进入堆栈,num1、num2初始化。 调用swap方法,将swap ()放入堆栈中,复制num1和num2的并将其传递给a和b。 在swap方法中,交换a、b的值。 swap方法执行完成,交换了a、b的值。 swap方法弹堆栈。 主函数弹栈。 分析:在swap方法中,交换a、b的值对num1、num2没有影响。 因为a、b的值只是从num1、num2复制的。

也就是说,a、b相当于num1、num2的拷贝,拷贝的内容无论怎么修改都不会影响原始本身。

引用传递publicstaticvoidmain (string [ ] args ) int [ ] arr={ 1、2、3、4、5 }; 变更(arr ); system.out.println(arr[0]; //数组的第一个元素为0 publicstaticvoidchange (int [ ] array ) ) { int len=array.length; array[0]=0; }执行结果:

0原因:进程:主函数进入堆栈,int[] arr初始化。 调用change方法,将change ()放入堆栈中,复制arr的地址值并将其传递给array。 change方法根据地址值在堆中找到数组,并将第一个元素的值更改为0。 执行了change方法,更改了数组中第一个元素的值。 change方法弹堆栈。 主函数弹栈。 解析:调用change ()时,形参array将收到arr地址值的副本。 另外,在change方法中,根据地址值操作数组。 change方法弹出堆栈后,数组的值发生了更改。 在main方法中,打印的arr[0]也从原始的1变为0。

无论是主函数还是change方法,操作的都是与同一地址值对应的数组。

就像你把自己家的钥匙给了另一个人一样,这个人拿着钥匙在你家恶作剧去了。 自从你带钥匙回家后,房子已经折腾完了,变成了悲惨的样子。

这里的密钥相当于地址值,房子相当于数组本身。

字符串直通publicstaticvoidmain (字符串[ ] args ) { String str='AAA ); 变更(str; system.out.println(str; } publicstaticvoidchange (strings ) { s='abc '; }执行结果:

AAA这太棒了!

String是类,类是引用数据类型,作为参数传递时应该引用传递。 但是,从结果来看,似乎是值的传达。

原因:字符串的API中有“theirvaluescannotbechangedaftertheyarecreated”一词。

也就是说,String的值在创建后不能更改。

API包含以下部分:

String str='abc ';

同等:

char data[]={'a '、' b '、' c'};

stringstr=new string (数据;

也就是说,修改String对象str与重新创建对象并将新地址值指定给str相同。

这样,上面的代码可以写如下。

publicstaticvoidmain (string [ ] args ) { String str1='AAA '; 变更(str 1; system.out.println(str1; } publicstaticvoidchange (strings ) chardata )=(a )、(b )、(c ) stringstr=newstring ) data ); s=str; (流程)主函数进入堆栈,初始化str1。 调用change方法,将change ()放入堆栈中,复制str1的地址值并将其传递给s。 在change方法中,再现创建字符串对象“abc”,s指向新的地址值。 执行了change方法,s指向的地址值已更改。 change方法弹堆栈。 主函数弹栈。 分析:将String对象作为参数传递时,类String是特殊的,但仍然在进行引用传递。String对象一旦创建,内容不可更改。每一次内容的更改都是重现创建出来的新对象

change方法执行完成后,s指向的地址值已更改。 s的原始地址值是复制的副本,因此不能改变str1的值。

字符串类型相似情况: class Person { String name; 公共人员(字符串名称) { this.name=name; } public class test { publicstaticvoidmain (string [ ] args ) personp=newPerson('cqdsb ' ); 变更(p; 系统. out.println (p.name; } publicstaticvoidchange (personp ) { Person person=new Person ('跳跃的绿草'); p=人员; }运行结果:

在传递cqdsb汇总值时,将实参的,copy传递给形参一份。 引用时,将实参的地址值,copy作为形参交给一份。 也就是说,无论是讲价还是引用传递,形参拿到的只是实参的复印件,而不是实参本身。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。