前言: 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作为形参交给一份。 也就是说,无论是讲价还是引用传递,形参拿到的只是实参的复印件,而不是实参本身。