java中函数传递参数的方式都是 『传值』,这是最根本的。
对于基本型变量如int、float等来说,传递的是变量的内容,函数中的产生一个新的变量来接收参数的值,它们两个是两个内容一样的 『不同变量』 ,所以在函数中改变不会影响到原来的变量。
对于参数是对象来说,传递的是对象引用的一个副本,也就是说,函数中产生了一个引用变量,这个引用变量的值和作为参数传过来的那个变量的值是一样的,这两个不同的变量指向内存中同一个地址,即同一个对象。那么此时就有两种情况,假设a为函数中的接收参数的变量:
1.当执行如a=其他对象,a=new等赋值操作时,实际上是将a指向新的位置,那么函数外的原值不改变。
2.如果在函数中执行的是对a的成员变量的操作,或者调用对象中修改成员变量的函数,那么就改变了原值。
public class Test{
public static void main(String[] args){
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+","+b);
}
public static void operate(StringBuffer x, StringBuffer y){
x.append(y);
y=x;
}
}
答案:AB,B
y=x; 只是表示y和x都指向同一个对象,但是你并没有对y原先所指向的对象作改变,因此实参b所指向的对象也就没有改变,输出当然是B;这个和你在c/c++中传指针是一样的道理,你在函数中改变指针变量本身的值并不会改变指针指向对象的值。 |