关于 java 引用传递和值传递,你的知否?

z_yes163 2012-12-10 03:23:47
为什么sun要这么 做
public class Test03 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("good");
StringBuffer s2 = new StringBuffer("bad");
test(s, s2);
System.out.println(s);// 9 goodhah这里为什么是 goodhah
System.out.println(s2);// 10 bad
但这里为什么是 bad

}

static void test(StringBuffer s, StringBuffer s2) { // 此
System.out.println("s="+s);// 1 good
System.out.println("s2="+s2);// 2 bad
s2 = s;// 3
s = new StringBuffer("new");// 4
System.out.println("s="+s);// 5 new
System.out.println("s2="+s2);// 6 good

s.append("hah");// 7goodhah
s2.append("hah");// 8

System.out.println("s="+s+">>>>>>>>>");// 9 newhah
System.out.println("s2="+s2+">>>>>>>>>");// 10 goodhah
}
高手们解答 一下
...全文
322 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
沭灬望月 2012-12-11
  • 打赏
  • 举报
回复
楼主不要想太复杂了。记住一点:JAVA只有值传递。只不过像引用类型传的是地址值,而接受地址值的变量就能够访问这个对象,所以只是看起来像是引用传递。 在你给的例子里边,test()方法里从 “s2 = s”一句开始,test()里不在有变量持有main()中的s2的地址,所以不论后边怎么改变,main()中的s2都是"bad"。而main()中的s的地址值赋给了test()中的s2,所以s的值就是test()中s2最后的值
悲催的程序猿 2012-12-11
  • 打赏
  • 举报
回复
引用 6 楼 ydehh 的回复:
java 都是值传递。。。引用传的地址的值而已
+1
l2316623667 2012-12-11
  • 打赏
  • 举报
回复
学习学习下!
jumpheightway 2012-12-11
  • 打赏
  • 举报
回复
这个其实可以从变量的有效范围解释 把你的代码稍作修改 static void test(StringBuffer s, StringBuffer s2) { // 此 System.out.println("s=" + s);// 1 good System.out.println("s2=" + s2);// 2 bad s2 = s;// 3 s = new StringBuffer("new");// 4 s2 = new StringBuffer(s.toString()); System.out.println("s=" + s);// 5 new System.out.println("s2=" + s2);// 6 good s.append("hah");// 7goodhah s2.append("hah");// 8 System.out.println("s=" + s + ">>>>>>>>>");// 9 newhah System.out.println("s2=" + s2 + ">>>>>>>>>");// 10 goodhah }
Think.Chen 2012-12-11
  • 打赏
  • 举报
回复
受教了,以前总是迷糊,现在明白多了
softone119 2012-12-10
  • 打赏
  • 举报
回复
java 都是值传递。。。引用传的地址的值。 分析一下你的例子: s2 = s;// 3 s2指向了s的地址 s = new StringBuffer("new");// 4 s指向了另外一个新的地址 所以这一句:s2.append("hah");// 8,它才是改变了原始的s值的“罪魁祸首”,你把它改成s2.append("i am s1"); 看看输出,会看得更明白。 至于7中对s的操作,此s已非main中的s,当然不会影响main中的s值。 不知道我有没有说得更明白些。。。。。
licip 2012-12-10
  • 打赏
  • 举报
回复
java 都是值传递。。。引用传的地址的值而已 这个说的很对。
jackson_fighting 2012-12-10
  • 打赏
  • 举报
回复
引用 7 楼 z_yes163 的回复:
引用 4 楼 SDN_SUPERUSER 的回复:答案是 java中只有值传递 这个 帖子 不错,算是 理解一直以来的疑惑,看来java基础还是 很难理解的
java基础是最难的 磨刀不误砍柴工
z_yes163 2012-12-10
  • 打赏
  • 举报
回复
引用 4 楼 SDN_SUPERUSER 的回复:
答案是 java中只有值传递
这个 帖子 不错,算是 理解一直以来的疑惑,看来java基础还是 很难理解的
ydehh 2012-12-10
  • 打赏
  • 举报
回复
java 都是值传递。。。引用传的地址的值而已
jackson_fighting 2012-12-10
  • 打赏
  • 举报
回复
楼主看下这篇帖子 你会受益匪浅 http://bbs.csdn.net/topics/390245117
jackson_fighting 2012-12-10
  • 打赏
  • 举报
回复
答案是 java中只有值传递
z_yes163 2012-12-10
  • 打赏
  • 举报
回复
// public class Test03 { public static void main(String[] args) { StringBuffer s = new StringBuffer("good"); //此处 s 在内存的堆中 但是good在内存的栈中 s 是指向 good 的一个标记 简单来说是 内存的高四位地址 StringBuffer s2 = new StringBuffer("bad"); //此处 s2 在内存的堆中 但是bad在内存的栈中 s2 是指向 bad的一个标记 简单来说是 内存的高四位地址 test(s, s2); System.out.println(s);// 9 //因为在test中s 重新指向了 另外一块 地址所以s最后的值是 goodhah System.out.println(s2);// 10 bad //此处 是s2虽然在test中s2 =s 但是s2所指向的标记 bad并没有变 所以依旧是bad 但这里为什么是 bad } static void test(StringBuffer s, StringBuffer s2) { // 此 //此处s s2 的值都是上面传进来的 (java 只有 值传递) System.out.println("s="+s);// 1 good System.out.println("s2="+s2);// 2 bad s2 = s;// 3 //此处s2的引用指向了s 也就是 s 指向的引用值 good s = new StringBuffer("new");// 4 //此处s 被重新定义 及 s 指向new 的地址 及s的指向的值是new System.out.println("s="+s);// 5 new System.out.println("s2="+s2);// 6 good s.append("hah");// 7goodhah //此处 s的值是good good+hah s 指向的栈中存的值是goodhad s2.append("hah");// 8 //此处 s2的值是new new +hah s2 指向的栈中存的值是newhad System.out.println("s="+s+">>>>>>>>>");// 9 newhah System.out.println("s2="+s2+">>>>>>>>>");// 10 goodhah } 各位大虾 请赐教,不知道我说的对不对!!!哈哈哈哈 !
snow-is-my-Love 2012-12-10
  • 打赏
  • 举报
回复
简单来说 就是,变量是变量 , 值是值。
zxhcloth 2012-12-10
  • 打赏
  • 举报
回复
你既然会提出这个问题,那么我的解释相信你也还是会云里雾里。 我给你剖析下以下这行代码,你再重新分析过代码。 StringBuffer s = new StringBuffer("good"); 1、在jvm中的栈里创建了一个变量s 2、在jvm中的堆里创建了一个StringBuffer对象的区域,里面存有值“good” 3、变量s的引用指向上述2所创建的堆区域 也就是说在jvm里s和new StringBuffer("good")是分开的,这也是解除你疑惑的关键点 再给你剖析下s2 = s;这行代码: s2这个变量的引用指向s这个变量的引用

81,092

社区成员

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

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