咨询java高手,对象数组作为方法参数时的引用传递的问题

写了下面2个方法:
方法1:
public void SwapString1(StringBuffer str1,StringBuffer str2){
StringBuffer str3=new StringBuffer();
str3=str1;
str1=str2;
str2=str3;
}
方法2:
void PrintScoreByYuwen(Studentclass[] s){
for(int i=0;i<s.length;i++){
for(int j=i+1;j<s.length;j++){
if(s[i].yuwen >s[j].yuwen){
Studentclass tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}
}

都是引用传递,为何在main方法调用时,方法1不会改变实参
方法2会改变实参(对象数组)内的排列顺序
这2个有什么区别吗

方法一其实也是按引用传递,但是千万千万要注意,你要修改的是“对象的值”,而不是“对象引用的值”。形参和实参对应的是对象的引用地址,所以这句写得很有问题: str1=str2;
你这里是试图将str1的值用str2代替, 但是这里的str1是形参,当外面传入了一个实参的对象引用是,你只是将内部的形参的引用改掉了,而没有修改实参的内容...这样在内部是把str1,str2对调了,但是外部实参的对象引用没有变,还是原来的值。

如果要把该方法生效,可以修改方法1如下:

public void SwapString1(StringBuffer str1, StringBuffer str2) {
StringBuffer str3 = new StringBuffer();
str3.append(str1.toString());
str1.replace(0, str2.toString().length(), str2.toString());
str2.replace(0, str3.toString().length(), str3.toString());
}
str1=str2;追问

方法1我知道是改变形参的值,没有改变实参的值
我的问题是,方法2为何改变了实参的值呢?方法2难道不是应该仅仅改变实参的值吗

追答

注意一下方法2, 你传递进去的实参是s数组,这样在方法内部是对s这个数组引用进行操作,当然s[i]这种修改的就是对象的值了,因为这个是你s数组引用对应到的对象。
建议你对“对象” 和“对象引用”好好思考一下。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-02-16
施主没有理解JAVA中传值和和传引用的涵义,其实JAVA中都是传“值”。
方法一对传递进来的两个对象进行了地址交换
方法而对数组对象s中的成员进行了排序并没有s所指向的内存地址并没有发生改变。
回答完毕!
第2个回答  2013-02-21
因为方法一在该形参的值,实参没动,方法二动了实参,当然值就变了!1