先看基本类型作为参数传递的例子:
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指向的是同一个对象