public class Foo
{
public static void main (String [] args)
{
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b);
System.out.print(a + "," + b);
}
static void operate (StringBuffer x, StringBuffer y)
{
x.append(y) ;
y = x;
}
}
{
public static void main (String [] args)
{
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b);
System.out.print(a + "," + b);
}
static void operate (StringBuffer x, StringBuffer y)
{
x.append(y) ;
y = x;
}
}
你寫成static是在加載的時候就執行了一次operate了
y=ab了
然后再次執行輸出是aab把
{
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.deleteCharAt(0).append("C");
}
结果是AB,B;如果用注释的部分替代y = x,结果为AB,C;
x.appen(y)这句使x所指向的值变化,而y=x这句却是使y指向x的值。然而a和b仍然指向的是原来的值,所以
结果为AB,B;如果用注释部分代替,则是使y所指向的值变化,这样结果为AB,C;
如果把StringBuffer换成String,在operate函数中相应的改变,则结果对原值无影响,因为String是
不可变的,每次对其的变化其实是他自己又重新申请了内存块,然后指向了新的内存块,对原来的值根本没有
变化,而StringBuffer是可变的,每次的变化可以在本身进行改变,而且如果变化的值本来就存在,就会直接指向
已经存在的那一块,这个和String是一样的。如 y =x,就是直接指向了X。
传的是地址。
System.out.print(a + "," + b); 这里先输出了 AB 然后输出了B。
public class Test2 { public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(
a,
b);
//因为你在方法operate内部对a的属性改变了,所以这里a输出AB
//你在方法operate内部只是把b引用指向了x(a),但是方法结束后引用会重新指向之前的那个地址块,也就是说b!但是咱们在方法内部没有对引用b(y)指向的地址块的内容改变,那个地址里的内容是不变的!
System.out.println(a + "," + b);
} static void operate(StringBuffer x, StringBuffer y) {
//就相当于你改变了StringBuffer a的一个属性,这么理解吧
x.append(y);
//y引用指向了x(a)
y = x;
System.out.println(x);//输出AB
System.out.println(y);//输出AB }
}
输出结果:
AB
AB
AB,B
既然y指向x,那打出来得应该是AB,A 啊?为什么a和b仍然指向的是原来的值?
{
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;
System.out.println(x+ "," + y); ///////////////
}
}
在楼主的代码中加上一行,输出的结果是AB,AB AB,B
楼主就能明白a,x,y的指向的地址de内容是“AB” 而b指向的地址de内容是“B”
zai传参数的时候,y=b;是把y指向了b中的内容;而在y=x时y指向的是a(或x)中的内容“AB”
明白了没有?
lz在operat()中传递的是对象,
x.append(y)这句对对象本身的成员作了修改,所以方法结束后依然有效。
y=x这句只是对对象的引用作了修改,在方法中是有效的,方法结束后失效。原来的引用还是指向原先的对象。
x.append(y) ; //改变了 x引用的类的对象。
y = x; //只是改变了y的引用,并没有改变 y引用的对象。
(y和b 虽然有同一个对象的引用。但,他们是两个变量,不是一个,所以,改变y的引用,根本没法改变b的引用)
{
public static void main (String [] args)
{
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b); //a=x="AB",虽然y的直也改变了,由于y是引用,所以b的直不变
//a="AB",b="B"
System.out.print(a + "," + b);
}
static void operate (StringBuffer x, StringBuffer y) //x=a="A" y=b="B"
{
x.append(y) ;//x=a="AB" y=b="B"
y = x; //x="AB" y=x="AB",y的应用指向x也就是a,但是并没有改变b的直“ B”
}
}
public class Test3 {
public static void main (String [] args)
{
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b);
System.out.print(a + "," + b);
}
static void operate (StringBuffer x, StringBuffer y)
{
x.append(y) ;
y.deleteCharAt(0).insert(0,x);
} }
static void operate(StringBuffer x, StringBuffer y)
{
x.append( y );
y = x;//其实这里应该这样理解,y是x的另外一个引用
x.append(" 1111111 ");
}最后输出应该是
AB11111111,B
当调用operate(a, b)方法的时候是吧a,b的地址存放到x,y中,operate 中 x.append(y)是吧a地址中的值改变了所以a的值是:AB
y = x;是把y的指向了x的地址而b地址里面的值没有变化所以b的值是:B
所以输出 AB,B