import java.lang.StringBuffer;
public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
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。
**想问下问什么变量b输出的值是B???为什么operatr方法中语句“x.append(y)”可以影响到方法外的a的值,
但语句“y=x”却没有影响到方法外b的值?**
public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
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。
**想问下问什么变量b输出的值是B???为什么operatr方法中语句“x.append(y)”可以影响到方法外的a的值,
但语句“y=x”却没有影响到方法外b的值?**
y 指向 b
x 调用方法 => a 调用方法
y 指向 x
方法结束 x,y生命结束最终外部结果:a 调用了方法 老生常谈 日经贴
1.对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
2.对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
上面说的第二种本质上也是值传递,传递的对象本身并不会改变,改变的仅仅是该对象的成员的值。
就是y指向了那个append后含字符串“AB”的StringBuffer,之前y,b都指向StringBuffer "B"
但这没有意义,因为y马上就要死了,operate()方法结束之时也就是它的死期。
而b还活着
x.append(y):此时x=a,两个指的同一个对象x,因此他们所指的对象会改变。
y=x:此时b句柄副本y已经从指向B对象,到指向x对象,但是b句柄还是指向B对象。B对象未作任何操作。所以结果还是之前的初始赋值。
y=x:此时b句柄副本y已经从指向B对象,到指向A对象
http://topic.csdn.net/u/20110613/12/1cb3a916-b756-423d-bbff-be97a9d2a8b9.html
public class Test {/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
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=y;
x.append("C");}}
楼主看看这个代码的运行结果
b-->Bpublic static void operate(StringBuffer x,StringBuffer y)
// x=a -->A
// y=b -->B
{
x.append(y);
//x-->x+"B"="AB"
y=x;
// y=x -->"AB"
在这里y与x的指向相同,脱离与b的关系,所以b仍指向B}