请问下面的输出结果是啥?

cyuyanzhiwen 2015-01-12 03:52:27
public class Jtest{
public static void main(String[] args) {
StringBuffer a=new StringBuffer ("A");
StringBuffer b=new StringBuffer ("B");
oper(a,b);
System.out.print(a+","+b);
}
static void oper(StringBuffer c,StringBuffer d){
c.append("B");
d=c;
}
}
...全文
321 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
对象传递的是引用,可以这么理解的吧。。
2.wa 2015-01-12
  • 打赏
  • 举报
回复
wasdasdfqwer 2015-01-12
  • 打赏
  • 举报
回复
引用 9 楼 cyuyanzhiwen 的回复:
[quote=引用 8 楼 wufengui1315 的回复:] 此题关键就在于 oper(c,d) 方法,这个方法到底做了什么,怎么结果就和想的不一样呢? 那么,就来看一下这个方法做了什么。我写了一段代码替代这个方法,如有不对的地方还望指出:

package test;
public class Jtest{
      public static void main(String[] args) {
    	   StringBuffer a=new StringBuffer ("A"); 
           StringBuffer b=new StringBuffer ("B");
           //取代 oper(a,b) start;
    	  	StringBuffer c;
    	  	StringBuffer d;
    	  	c = a; //c的地址指向了a,此时 c 的值为"A";
    	  	d = b; //d的地址指向了b,此时 d 的值为"A";
    	  	c.append("B"); //在c(a)的地址值变为 “AB”
            d=c; // d的地址指向了c,也就是指向了a,**关键就在这里了**,那么可以看到,这个过程中根本就没对b做任何操作,
            //就好像gg(d)路过一mm(b),说:这mm(b)不错,然后发现前面有个更有吸引力的mm(c),然后拿了一朵花("B")给mm(c(a))了,然后就见异思迁了,所以mm(b)压根就不知道什么情况,没参与
           // so, b 还是b("B") , a已不是a("A"),二是a("AB")
            //取代 oper(a,b) end; 
            System.out.print(a+","+b);
      }
      static void oper(StringBuffer c,StringBuffer d){
          c.append("B");   
          d=c;
          //一开始的想法是这样的,c = a; d= b; 那么 c.append("B");后 c=“AB”,d=c = "AB",实际上并不是数学中的简单等价传递
      }
}
谢谢,我明白了,再问下,java中什么情况传值,什么情况下传址呢?[/quote] 我也不大懂噢,但是如果是int类型的话,就是值传递,如果是 传递对象比如Collection 那么就是传址了,你搜一下,有很多博客写这个歌值传递和引用传递的
cacagege 2015-01-12
  • 打赏
  • 举报
回复
public class TestMain { public static void main(String[] args) { // TODO Auto-generated method stub String s1 = "aaa"; String s2 = "bbb"; System.out.println(s1 + "," + s2); swap(s1, s2); System.out.println(s1 + "," + s2); } private static void swap(String x1, String x2) { String temp; temp = x1; x1 = x2; x2 = temp; } } 这个和楼主那个貌似是一样的道理
cyuyanzhiwen 2015-01-12
  • 打赏
  • 举报
回复
引用 8 楼 wufengui1315 的回复:
此题关键就在于 oper(c,d) 方法,这个方法到底做了什么,怎么结果就和想的不一样呢? 那么,就来看一下这个方法做了什么。我写了一段代码替代这个方法,如有不对的地方还望指出:

package test;
public class Jtest{
      public static void main(String[] args) {
    	   StringBuffer a=new StringBuffer ("A"); 
           StringBuffer b=new StringBuffer ("B");
           //取代 oper(a,b) start;
    	  	StringBuffer c;
    	  	StringBuffer d;
    	  	c = a; //c的地址指向了a,此时 c 的值为"A";
    	  	d = b; //d的地址指向了b,此时 d 的值为"A";
    	  	c.append("B"); //在c(a)的地址值变为 “AB”
            d=c; // d的地址指向了c,也就是指向了a,**关键就在这里了**,那么可以看到,这个过程中根本就没对b做任何操作,
            //就好像gg(d)路过一mm(b),说:这mm(b)不错,然后发现前面有个更有吸引力的mm(c),然后拿了一朵花("B")给mm(c(a))了,然后就见异思迁了,所以mm(b)压根就不知道什么情况,没参与
           // so, b 还是b("B") , a已不是a("A"),二是a("AB")
            //取代 oper(a,b) end; 
            System.out.print(a+","+b);
      }
      static void oper(StringBuffer c,StringBuffer d){
          c.append("B");   
          d=c;
          //一开始的想法是这样的,c = a; d= b; 那么 c.append("B");后 c=“AB”,d=c = "AB",实际上并不是数学中的简单等价传递
      }
}
谢谢,我明白了,再问下,java中什么情况传值,什么情况下传址呢?
wasdasdfqwer 2015-01-12
  • 打赏
  • 举报
回复
此题关键就在于 oper(c,d) 方法,这个方法到底做了什么,怎么结果就和想的不一样呢? 那么,就来看一下这个方法做了什么。我写了一段代码替代这个方法,如有不对的地方还望指出:

package test;
public class Jtest{
      public static void main(String[] args) {
    	   StringBuffer a=new StringBuffer ("A"); 
           StringBuffer b=new StringBuffer ("B");
           //取代 oper(a,b) start;
    	  	StringBuffer c;
    	  	StringBuffer d;
    	  	c = a; //c的地址指向了a,此时 c 的值为"A";
    	  	d = b; //d的地址指向了b,此时 d 的值为"A";
    	  	c.append("B"); //在c(a)的地址值变为 “AB”
            d=c; // d的地址指向了c,也就是指向了a,**关键就在这里了**,那么可以看到,这个过程中根本就没对b做任何操作,
            //就好像gg(d)路过一mm(b),说:这mm(b)不错,然后发现前面有个更有吸引力的mm(c),然后拿了一朵花("B")给mm(c(a))了,然后就见异思迁了,所以mm(b)压根就不知道什么情况,没参与
           // so, b 还是b("B") , a已不是a("A"),二是a("AB")
            //取代 oper(a,b) end; 
            System.out.print(a+","+b);
      }
      static void oper(StringBuffer c,StringBuffer d){
          c.append("B");   
          d=c;
          //一开始的想法是这样的,c = a; d= b; 那么 c.append("B");后 c=“AB”,d=c = "AB",实际上并不是数学中的简单等价传递
      }
}
wasdasdfqwer 2015-01-12
  • 打赏
  • 举报
回复
不知道第一次做这个面试题的时候有多少人作对了
hacker171 2015-01-12
  • 打赏
  • 举报
回复
运行结果AB,B 具体解释:调用函数oper(a,b),将c指向a所指向的地址,d指向b所指向的地址,执行c.append("B")语句,是将c所指向的地址所存储的值由原来的“A”变为"AB",而执行语句d=c,只是将d指向了c所指向的地址,并不影响b的指向,所以结果变为a=“AB”,b=“B”
姜小白- 2015-01-12
  • 打赏
  • 举报
回复

static void oper(StringBuffer c,StringBuffer d){
          c.append("B");   // a = AB
          d=c;                     //  b 的拷贝指向了a 的地址,和b 本身的指向已经没有关系了,b 依然是 B
}
leeKitty 2015-01-12
  • 打赏
  • 举报
回复
StringBuffer c 和 StringBuffer a 是同一个内存空间 c.append("B"); 就是往空间里加入元素 结果为 AB,B
leeKitty 2015-01-12
  • 打赏
  • 举报
回复
结果是 AB,B
繁华终归落尽 2015-01-12
  • 打赏
  • 举报
回复

c.append("B"); //会改变c所指向对象的值
d=c;                   //d只是b的一份引用拷贝,此处赋值只会改变d,与b无关
YangSy_001 2015-01-12
  • 打赏
  • 举报
回复
输出是A,B

62,614

社区成员

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

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