public static void changeStringBuffer(StringBuffer s) // 传进来是s的拷贝 { StringBuffer t = new StringBuffer("456"); s = t; // 将拷贝的地址指向了新的对象空间,这时,s 的拷贝已经不指向之前的s 的地址了,而是刚new 的t }StringBuffer n = new StringBuffer("123"); // 调用之前传递的是123 changeStringBuffer(n); // 这里面将n的拷贝指向了t,也就是456的地址 但 n 指向的仍然是123
main方法和changeString、changeStringBuffer都是方法,他们内部的属性都是局部变量,如果想改变值,把main里的String m = "123" 放在类中方法外,提升为全局变量;这就好比一个张照片,你借给了你基友,然后你基友把照片改了,你又要回来了;
main方法和changeString、changeStringBuffer都是方法,他们内部的属性都是局部变量,如果想改变值,把main里的String m = "123" 放在类中方法外,提升为全局变量;这就好比一个张照片,你借给了你基友,然后你基友把照片改了,你又要回来了; 我楼上说错!!!!!你main方法外的两个方法,他们参数内的是两个局部变量,你把值传给那两个局部变量,而局部变量改变的只是他自身的值而已,好比a=1;b=a;b=3;a依然是1
你在调用changeStringBuffer方法时,传递的是StringBuffer对象实例的引用没错,changeStringBuffer方法体里面 StringBuffer t = new StringBuffer("456"); s = t; 只是改变了方法参数s的引用地址,并没有改变实参 n 的对象引用。 而你打印的是实参 n 的引用的对象内容。当然不会改变了
{
String s1 = m;
s1 = "456";
s1 = s1.concat("456");
}
System.out.println(m);
System.out.println("change m = " + m);
System.out.println("m = " + m);
StringBuffer n = new StringBuffer("123");
{
StringBuffer s2 = n;
StringBuffer t = new StringBuffer("456");
s2 = t;
}
System.out.println("n = " + n); } catch (Throwable e) {
e.printStackTrace();
} }
public static void changeStringBuffer(StringBuffer s) // 传进来是s的拷贝
{
StringBuffer t = new StringBuffer("456");
s = t; // 将拷贝的地址指向了新的对象空间,这时,s 的拷贝已经不指向之前的s 的地址了,而是刚new 的t
}
s = new StringBuffer("789");这怎么解释。
{
StringBuffer t = new StringBuffer("456");
s = t; // 将拷贝的地址指向了新的对象空间,这时,s 的拷贝已经不指向之前的s 的地址了,而是刚new 的t
}StringBuffer n = new StringBuffer("123"); // 调用之前传递的是123
changeStringBuffer(n); // 这里面将n的拷贝指向了t,也就是456的地址
但 n 指向的仍然是123
我楼上说错!!!!!你main方法外的两个方法,他们参数内的是两个局部变量,你把值传给那两个局部变量,而局部变量改变的只是他自身的值而已,好比a=1;b=a;b=3;a依然是1
你可以用 StringBuffer的对象。toString操作传递给String.
StringBuffer t = new StringBuffer("456");
s = t;
只是改变了方法参数s的引用地址,并没有改变实参 n 的对象引用。
而你打印的是实参 n 的引用的对象内容。当然不会改变了
java堆通过引用来管理java对象,而java不允许直接获取地址,那么我们只能委婉的通过引用来找到一个确定的对象。
像LZ说的:
main: SB sb1 = "123"; change(sb1);
change: SB sb2 = "456"; sb1 = sb2;
实际上是改变了change方法中sb1引用的目标,也就是将sb1的引用指向了sb2的对象。但是change方法里的sb1只是"123"对象的一个引用的副本。也就是说mian方法里的引用并没有被修改。
进一步说,为什么下面的代码不需要return 语句 public static void main(String[] args) {
StringBuffer sb = new StringBuffer("123");
change(sb);
System.out.println(sb);
}
static void change(StringBuffer s){
s.append("abc");
}
为什我们传递对象的时候么不需要像传值那样需要return new value呢,因为change方法接收的参数是一个sb的引用的副本,改变了目标地址的值,因此不需要return.