StringBuffer传的不是引用吗?

CoolEgos 2014-07-22 09:55:21
public class StringTest{
public static void changeString(String s)
{
s = "456";
s = s.concat("456");
}

public static void changeStringBuffer(StringBuffer s)
{

StringBuffer t = new StringBuffer("456");
s = t;
}
public static void main(String args[])
{
String m = "123";
changeString(m);
System.out.println(m);
System.out.println("change m = " + m);
System.out.println("m = " + m);
StringBuffer n = new StringBuffer("123");
changeStringBuffer(n);
System.out.println("n = " + n);
}
}

代码如上,为什么最后输出的不是“n=456”?而是“n=123”??
...全文
671 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
刃雪 2014-07-29
  • 打赏
  • 举报
回复
因为你把n传给了changeStringBuffere,但你的方法里却没有任何返回值。所以changeStringBuffere里对传进去的值做任何操作都只是在他自己的方法内有效。除非你返回值,然后再在主方法里接受返回的值。
阿飞的蝶 2014-07-29
  • 打赏
  • 举报
回复
引用 23 楼 xiaozji 的回复:
Java中只有值传递,
我不认可你的说法。我觉得java传对象的时候实质上就是传的地址,或者更精确的讲,传对象就是传地址的引用。 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.
等风的云 2014-07-26
  • 打赏
  • 举报
回复
Java中只有值传递,
yueyuexiong 2014-07-25
  • 打赏
  • 举报
回复
还是值传递和引用类型传递的区别吗??
ddr1314 2014-07-25
  • 打赏
  • 举报
回复
你在调用changeStringBuffer方法时,传递的是StringBuffer对象实例的引用没错,changeStringBuffer方法体里面 StringBuffer t = new StringBuffer("456"); s = t; 只是改变了方法参数s的引用地址,并没有改变实参 n 的对象引用。 而你打印的是实参 n 的引用的对象内容。当然不会改变了
nineteensky 2014-07-25
  • 打赏
  • 举报
回复
引用 9 楼 u012576250 的回复:
mian方法里的属性或者对象,都是方法内局部的,而你的其他两个方法,他们里面的属性或者对象,也都是局部的,两个互不干扰的局部变量,怎么会影响值的改变?好比你有张美女照,然后你复制一分给了你的基友,你基友把你复制的这份美女照给丑化了,你的美女照会受影响么?
这个解释好到位
chen870201 2014-07-23
  • 打赏
  • 举报
回复
这可以理解成局部变量吗
jenly10 2014-07-23
  • 打赏
  • 举报
回复
shinan_77 2014-07-23
  • 打赏
  • 举报
回复
楼主肯定被C语言的指针影响过.....
PyueE 2014-07-23
  • 打赏
  • 举报
回复
通过方法来改变变量的值是不行的(这个值是指引用的值),可以这样来理解。当将变量传递给方法时,在方法的里边建立了一个变量(这个变量的作用域在这个方法内),这个变量的引用指向和你传递进来的参数指向相同的地址。变量直接赋值是改变的引用,对值没有影响。所以你将t直接赋值给s2(这个s2是方法内部的变量有别与你方法外部的那个s2),所以你改变这里的s2对你外边输出的s2没有影响。如果你是去该变的,比如通过s2.append("xxxx"),你再方法外再次输出的时候发现值已经改变,这里就是改变的引用指向的值。
CoolEgos 2014-07-22
  • 打赏
  • 举报
回复
引用 6 楼 magi1201 的回复:

public static void changeStringBuffer(StringBuffer s)  // 传进来是s的拷贝
{  
        StringBuffer t = new StringBuffer("456");
        s = t;  // 将拷贝的地址指向了新的对象空间,这时,s 的拷贝已经不指向之前的s 的地址了,而是刚new 的t 
}
那为什么现在输出的是“123”呢?
zhjdg 2014-07-22
  • 打赏
  • 举报
回复
StringBuffer s = new StringBuffer("456"); s = new StringBuffer("789"); 这怎么解释。
姜小白- 2014-07-22
  • 打赏
  • 举报
回复

public static void changeStringBuffer(StringBuffer s)  // 传进来是s的拷贝
{  
        StringBuffer t = new StringBuffer("456");
        s = t;  // 将拷贝的地址指向了新的对象空间,这时,s 的拷贝已经不指向之前的s 的地址了,而是刚new 的t 
}
wqc5461 2014-07-22
  • 打赏
  • 举报
回复
这样看就很好理解了。

	public static void main(String[] args) {

		try {

			String m = "123";
			{
				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();
		}

	}
wnf2009 2014-07-22
  • 打赏
  • 举报
回复
引用 3 楼 A38017032 的回复:
引用 2 楼 wnf2009 的回复:
实参你不能改变的
什么意思?
方法里操作的是你实参的拷贝,和你本身的实参没有关系
CoolEgos 2014-07-22
  • 打赏
  • 举报
回复
引用 2 楼 wnf2009 的回复:
实参你不能改变的
什么意思?
wnf2009 2014-07-22
  • 打赏
  • 举报
回复
实参你不能改变的
致知Fighting 2014-07-22
  • 打赏
  • 举报
回复
你不能修改原来变量,只能对原来对象进行操作。 比如你在方法里调用s.append,再打印就不一样了,但是你如果s=t这种是没用的
NeverMore_Mr 2014-07-22
  • 打赏
  • 举报
回复
使用StringBuffer新建对象(s1)时,对象s1在堆内存中,里面的字符内容(a1)在常量池,s1指向a1; 同理, 调用changeStringBuffer()方法,里面又新建一个对象(s2),s2中的字符内容(a2)也在常量池,s2指向a2. 将s1传入changeStringBuffer中后,虽然在该方法中s1 = s2 , s1也指向了a2, 但是堆内存中的s2却并未改变, 还是指向a1. 不知道这样解释对不对。
铭浩 2014-07-22
  • 打赏
  • 举报
回复
String和StringBuffer是两个相互独立的类,没有继承关系。 你可以用 StringBuffer的对象。toString操作传递给String.
加载更多回复(5)

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧