充分理解java中的参数传递~!

先看基本类型作为参数传递的例子:
public class Test1 {
       public static void main(String[] args) {
        int n = 3;
        System.out.println("Before change, n = " + n);
        changeData(n);
        System.out.println("After changeData(n), n = " + n);
    }
       public static void changeData(int nn) {
        nn = 10;
    }
}
我想这个例子大家都明白,基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的,输出的结果证明了这一点:
Before change, n = 3
After changeData(n), n = 3

再看看这个例子:

public class Test{
 
 public Test(){
 StringBuffer a=new StringBuffer("a");
    StringBuffer b=new StringBuffer("b");
    m(a,b);
    System.out.println (a+"  "+b);//打印出来的是ab,b
   }
 
 public void m(StringBuffer x,StringBuffer y){
    x.append(y);
    y=x;

   // 这里如果加上System.out.println(x+","+y);  则x,y对应的是 ab,ab
   }
 
 public static void main(String args[]){
    Test t=new Test();
    }
}
输出结果:
ab b

疑问:
题目的输出结果为什么是ab b而不是ab ab?

相关的java知识点:
关于java中参数传递问题 一是值传递,二是引用传递

按值传递是把参数的“值”复制到子例程的行参当中去,因此,对子例程参数所做
的改变对参数没有影响。当把一个简单的类型传递给方法时,他是按值传递的。

按引用传递是对一个参数的引用(不是参数的值)被传递给了参数,在子例程中,这个引用
被用来访问在调用中指定的实参,这也就意味着对参数的改变将会影响被用来调用子例程的参数。
对象的传递是按照引用来传递的。                                         

解答:
题目一中x,y分别是a,b的两个引用的拷贝
在整个过程中x一直指向a的内存地址,也就是说x是a的一个引用,语句x.append(y);把x的值改为
"ab",由于x是a的一个引用,StringBuffer对象a的值也变为"ab",语句y=x;是使x的内存地址赋给
y,此时y指向了x所指向的内存地址,也就是a的地址,此时的y就和对象b无关了,虽然执行该语句后
y的值变为了"ab",但是由于它和b并无关联,所以对b的值不造成影响,结果就是"ab  b"了,也就是
x,y分别是a,b的两个引用的拷贝.a通过x改变了原来的值,而y=x是将原本指向b的引用指向了a.
最后x,y,a指向的是同一个对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值