结论:JAVA中参数传递的方式只有一种方式,即值传递;
Java中有俩种数据类型:一:基本数据类型:即byte,short,int,long,float,double,char,boolean
二:复合数据类型:即String,StringBuffer,ArrayList等
Demo1:对于基本数据类型,做如下Demo:
public static void main(String []args){
int a =5 ;
System.out.println("初始的a的值为:"+a);
changeInt(a);
System.out.println("调用changeInt方法后a的值为:"+a);
}
public static void changeInt(int a){
a =8;
}
result : 初始的a的值为:5
调用changeInt方法后a的值为:5
我们看到,局部变量a被当作参数传入changeInt方法后,并没有改变其原来的值,这是因为传入的参数其实是a的值的一份拷贝,所以说无论changeInt方法如何使用a的值,原来的a的值都不会受到任何影响。
Demo2:对于复合数据类型(挑选StringBuffer作为实例测试),做如下Demo
public static void main(String []args){
StringBuffer sbf =new StringBuffer("Hello");
System.out.println("初始化StringBuffer实例sbf的值为:"+sbf);
changeStringBuffer(sbf);
System.out.println("调用changeStringBuffer方法后sbf的值为:"+sbf);
}
public static void changeStringBuffer(StringBuffer sb){
sb.append(" world");
}
运行结果:初始化StringBuffer实例sbf的值为:Hello
调用changeStringBuffer方法后sbf的值为:Hello world
我们发现,局部变量sbf的值在经changeStringBuffer方法调用后其值发生了改变 , 明明是值传递,为什么会发生这样的事情呢?查阅资料后,sbf 实际是一个引用,而该引用存的是实际的sbf对象在内存中的地址,在向changeStringBuffer传递参数时实际传的是引用的副本。所以说在changeStringBuffer方法内,局部变量sb引用指向的地址和sbf引用指向的地址是同一个地址即同一个对象,当changeStringBuffer方法内对sb指向的对象做了修改时,也就是改变了sbf指向的对象,所以说当我们输出sbf对象的值时,我们发现它被修改了。
Demo3: 复合数据类型中特殊情况之String(String类型的参数作为参数传递不会改变其值)
String 是final类型,并且是不可变的。
String s = "hello" <=> String s = new String("hello")
所以说,每次给String类型的变量赋值其实都在重新创建一个对象,并不会影响原先的String对象。
其最终的参数传递的结果和基本数据类型的参数传递结果是一样的。
网友评论