[size=medium]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);
}
static void operate(StringBuffer x ,StringBuffer y){
x.append(y);
y = x;
y.append("c");
}
}
[color=green]假设
new StringBuffer (“A”); 为内存1
new StringBuffer (“B”); 为内存2
a - 内存1
b- 内存2
方法的参数是引用的复制。虽然指向的是同一内存区域,但却是不同的句柄。
operate (StringBuffer x, StringBuffer y)
x - 内存1
y- 内存2
当 y = x时,是改变了 y 的引用指向,而不是 b 的,这里操作这块内存是没有问题的,但这样改变了引用的指向,也就是
x - 内存1
y- 内存1
这样对B指向的内存没有影响。
稍改了一下代码,这时Y已指向内存1了。
-------------
public class Foo {
public static void main(String[] args) {
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.append(y);
y = x;
y.append("C");
}
}
ABC,B[/color][/size]
[size=medium]参数是对象 ,副本和母本的值相同,指向了同一个对象,所以对副本指向的对象的操作会改变母本指向的对象的属性,所以x.append(y)会改变副本所指的对象的属性,而y=x只是修改副本的值,实参所指的对象的属性没有变化[/size]
[size=medium][color=brown]再如:
public class Test1 {
public static void add(Integer i){
int val = i.intValue();
val +=3;
i = new Integer(val);
}
public static void main(String[] args) {
Integer i = new Integer(0);
add(i);
System.out.println(i.intValue());
}
}
i= new Integer(val); 关键也在此,理由同上[/color][/size]
public static void main(String[] args) {
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.append(y);
y = x;
y.append("c");
}
}
[color=green]假设
new StringBuffer (“A”); 为内存1
new StringBuffer (“B”); 为内存2
a - 内存1
b- 内存2
方法的参数是引用的复制。虽然指向的是同一内存区域,但却是不同的句柄。
operate (StringBuffer x, StringBuffer y)
x - 内存1
y- 内存2
当 y = x时,是改变了 y 的引用指向,而不是 b 的,这里操作这块内存是没有问题的,但这样改变了引用的指向,也就是
x - 内存1
y- 内存1
这样对B指向的内存没有影响。
稍改了一下代码,这时Y已指向内存1了。
-------------
public class Foo {
public static void main(String[] args) {
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.append(y);
y = x;
y.append("C");
}
}
ABC,B[/color][/size]
[size=medium]参数是对象 ,副本和母本的值相同,指向了同一个对象,所以对副本指向的对象的操作会改变母本指向的对象的属性,所以x.append(y)会改变副本所指的对象的属性,而y=x只是修改副本的值,实参所指的对象的属性没有变化[/size]
[size=medium][color=brown]再如:
public class Test1 {
public static void add(Integer i){
int val = i.intValue();
val +=3;
i = new Integer(val);
}
public static void main(String[] args) {
Integer i = new Integer(0);
add(i);
System.out.println(i.intValue());
}
}
i= new Integer(val); 关键也在此,理由同上[/color][/size]