java 方法中的形参传值

来源:互联网 发布:java业余培训机构 编辑:程序博客网 时间:2024/06/17 05:11

今天看到一个String传值问题,才发现以前的认知都是错的,为防止以后忘记,写下来。
先来看一个问题:

public static void main(String[] args){    String a="abc";    String b="bcd";    change(a,b);    System.out.print("a为:"+a+"\n");    System.out.print("b为:"+b);}public void change(String a,String b){    a=b;    b=a+b;}

这个输出结果是什么呢?
结果是: a为:abc
b为:bcd
这事为什么呢?不是a和b经过change方法改变了值吗?
首先这里要弄清楚一个概念:String类型的值是不可变的,也就意味String类型在创建后这个对象就是不可变的。所以a和b的值变没变就看它引用的String对象变没变。而String类型在方法中作为参数时,和基本类型一样传递的是他的值,也就是在change方法中a和b只是接受到了实参a和b的值而不是它的引用,即change(a,b)就是change(“abc”,”bcd”);所以这个方法并没有改变原来的a和b的引用对象,他们引用还是之前的”abc”和”bcd”。所以a和b的输出结果都不回变。在这里就要重点说明一点,String类型在方法中传递的是值而不是引用。所以一般在方法中进行操作都不回影响原来的值。
要是StringBuffer呢?

   public static void main(String[] args){    StringBuffer a=new StringBuffer("abc");    StringBuffer b=new StringBuffer("bcd");    change(a,b);    System.out.print("a为:"+a+"\n");    System.out.print("b为:"+b);}public void change(StringBuffer x,StringBuffer y){    x=y;    y=x.append(y);} 

输出结果:a为:abc
b为:bcdbcd
由于除了String以外的引用类型对象在传递参数时传递的是引用(本质上还是值,就是a和b的引用值),也就是这里有四个引用,a,b,x,y。其中a,x引用的对象为”abc”,b,y引用的对象为”bcd”;执行”x=y”时,x引用的对象由”abc”变成了”bcd”,此时b,x,y都是引用同一个对象”bcd”;a还是引用”abc”对象。执行”y=x.append(y)”时:由于x和y引用的是”bcd”对象,所以执行完后对象”bcd”变成了”bcdbcd”,但x,y,b还是引用此对象,所以输出的b为:bcdbcd;而a为:abc。
综上所述,java方法参数传递中传递的都是值,但基本类型和String传递的就是基本类型的值,而引用类型传递的值是引用,所以在方法中要看引用变没变,所引用的对象变没变。
希望上述对各位有所帮助,在下菜鸟一枚,欢迎大牛指教。

原创粉丝点击