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为什么没有被赋值,都他妈的见了鬼了.
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为什么没有被赋值,都他妈的见了鬼了.
调用operate(a,b);时传来的时b的引用值,在operate函数中修改的也只是b的引用值y,所以并没有修改b对象本身。
这个问题的确有点奇怪的说
楼主注意,这里只是把a,b的引用符给个了x,y,本身是不变的。就是a,b所指向的内存地址是不变的。内存里值变化,是因为你用的是StringBuffer。
看看这个帖子吧,里面偶说的很详细了,就不在这里再说了。hoho
http://community.csdn.net/Expert/topic/5176/5176149.xml?temp=.9088861
因为在operate函数里面对外面传近来的对象进行了修改,是极其危险的
哈哈
如果方法的参数是对象类型,传递的是引用的拷贝。中的参数x,y是变量a,b的引用拷贝,即指向同一个对象。
y=x 并没有改变 b 的指向StringBuffer对象是可以修改的字符串。
它调用append()方法时,不重新分配内存,直接在先前的内存空间里进行修改。
所以 a 指向的内存中的值已经改变.
它调用append()方法时,不重新分配内存,直接在先前的内存空间里进行修改。
所以 a 指向的内存中的值已经改变.楼上的这句是关键,要注意这点与String的区别,本题涉及的其他知识就是关于传值和传引用的问题,已经讲很多了,这种题最好在纸上画画图就可以很好理解。先a指向A,然后在调用operate时,x也指向A,operate里面修改了x所指向的这段内存的内容(改为AB),由于a也指向的是也是指向这段内存的内容,相应的它的值也变化了。如果是String的话结果会有不同。
x.append(y);
y=x;
}x.append(y) 改变了x的属性
而y=x只是改变了y的引用建议楼主看一下java基础:The Java Programming Language
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; //这里y的指向改变了。不在代表b
y.append("我现在是代表A对象了");
System.out.println(x + "|" + y);
}
}
这个程序运行的结果如下:AB我现在是代表A对象了|AB我现在是代表A对象了
AB我现在是代表A对象了,B
int a = 1;
int b = 2;
int *c = &a; //c是a的引用
int *d = &b; //d是b的引用
main()
{
d = c; //d也成了a的引用
printf("%d",*d);
scanf("%d");
}
输出结果 1 变了;
再看下面的程序
int a = 1;
int b = 2;
int *c = &a; //c是a的引用
int *d = &b; //d是b的引用
void aaa(int *p1,int *p2)
{
p2 = p1;
}
main()
{
aaa(c,d);
printf("%d",*d);
scanf("%d");
}
输出结果是2 没变!! 原因:执行aaa(c,d);时传入的只是c,d的一个副本(当然他也是a,b的引用,但并不是c,d),所以并不影响真正的c,d
再看下面程序
int a = 1;
int b = 2;
int *c = &a; //c是a的引用
int *d = &b; //d是b的引用
void aaa(int *p1,int **p2)
{
*p2 = p1;
}
main()
{
aaa(c,&d);
printf("%d",*d);
scanf("%d");
}
输出结果是1,变了,不知道怎么表述了,表达能力有限,不好意思.
跟搂住这里的参数传递是一样的,因为传入的不是b,而是b的一个副本所以对b来说y=x无效,如果可以像上面一样传入一个b的指针的话可以,不过java好像不能实现哦
TestObject testB = new TestObject(2);
System.out.println("before modify");
// 修改之前打印出两个类对象,注意其HashCode
testA.print(testA.toString());
testB.print(testB.toString());
modify(testA, testB);
System.out.println("after modify");
// 修改之后打印出两个类对象,注意其HashCode
// A,B对象仍然是修改前的两个独立对象
// 而A对象已经通过内部方法修改,B对象则保持原貌
testA.print(testA.toString());
testB.print(testB.toString());
}
private static void modify(TestObject A, TestObject B) {
// A对象被内部方法修改
A.modify(11);
// B的引用发生改变,指向了A对象,而B对象不变
B = A;
System.out.println("modifying");
// 修改之后打印出两个类对象,注意其HashCode
// B对象跟A对象其实是同一个
A.print(A.toString());
B.print(B.toString());
}}
class TestObject{
int i;
public TestObject(int i) {
this.i = i;
}
public void modify(int i) {
this.i = i;
}
public void print(String className) {
System.out.println(className + "=" + i);
}
}结果:before modify
src.TestObject@7ced01=1
src.TestObject@1ac04e8=2
modifying
src.TestObject@7ced01=11
src.TestObject@7ced01=11
after modify
src.TestObject@7ced01=11
src.TestObject@1ac04e8=2