java方法参数的传递过程,是一个值的复制过程而非传递过程:
1)参数类型为基本类型时,复制的是基本类型的值变量
2)参数类型为引用类型,复制的是引用变量
这是一段测试代码(1)
public static void main(String[] args) {
A a = new A(1);//对象1
swap(a);
System.out.println(a.getA());
}
public static void swap(A a){
System.out.println(a);
a=new A(2);//对象2
System.out.println(a);
}
证明:java方法参数的传递过程,是一个值的复制过程而非传递过程
如果传参过程是引用变量的传递,那么,经过swap方法后,a引用的应该是对象2的地址;然而结果并不是,在主方法中打印的值仍然为对象1中的属性值。
由此可证明方法传参过程是 值 (或引用变量)的复制过程。
这恰恰解释了一直困扰我的一个现象:
在方法中将对象的引用作为参数,方法体中对该变量作属性修改,会真实生效。而Integer\ String 等类型的变量作修改时却不生效。 那是因为我们自定义的对象提供了对属性修改的支持,而Integer String 等对象的value声明为final的,每次赋值操作会new一个新的对象,因此并没有修改之前引用对象的值。
所以:java方法参数的传递过程,是一个值的复制过程而非传递过程。
代码片段(2)
public class foo {
public static void main(String sgf[]) {
StringBuffer a=new StringBuffer(“A”);
StringBuffer b=new StringBuffer(“B”);
operate(a,b);
System.out.println(a+”.”+b);
}
static void operate(StringBuffer x,StringBuffer y) {
//这是在x引用的对象内容,更改会生效。由于main方法里的a变量也引用了该对象
x.append(y);
//由于参数是变量的复制,因此y=x并未将main方法中的b变量改变
y=x;
}
}
//输出结果是 AB.B