A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余银桂 中级黑马   /  2012-6-16 21:44  /  1348 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Test{
  2.          public static void main(String[] args){
  3.          StringBuffer a=new StringBuffer("A");
  4.          StringBuffer b=new StringBuffer("B");
  5.          operate(a,b);
  6.          System.out.println(a+","+b);
  7.           }
  8.          public static void operate(StringBuffer x, StringBuffer y){
  9.           x.append(y); //这里被追加了 输出AB
  10.    y=x;   //为什么这里没有改变 输出还是B
  11.   }
  12.          }

  13. 运行结果是  AB,B
复制代码

5 个回复

倒序浏览
这个问题是由于引用引起的。

首先调用operate(StringBuffer x, StringBuffer y)方法的时候,这两个对象的引用被传递进去,
x.append(y);  x 引用指向的对象 追加了 y引用指向的对象了, 这个在syso中也有了体现,对象改变了。

而y=x; 是将当前对象的引用指向了其他对象,与之前的对象也脱离了关系,所以不会造成原对象的改变。

要弄清对象和对象的引用的关系。
回复 使用道具 举报
其实是有改变的,你可以在operate函数打印y看看。你的程序之所以输出的是AB B,因为当你的operate是void,没有返回值,所以当这个函数执行完后,内存就释放了y,所以打印就是原来B的值
  1. public class Test
  2. {
  3.      public static void main(String[] args)
  4.         {
  5.          StringBuffer a=new StringBuffer("A");
  6.          StringBuffer b=new StringBuffer("B");
  7.          StringBuffer aa=operate(a,b);
  8.          System.out.println(aa);
  9.      }
  10.      public static StringBuffer operate(StringBuffer x, StringBuffer y)
  11.     {
  12.                  
  13.           x.append(y); //这里被追加了 输出AB
  14.                   y=x;   //为什么这里没有改变 输出还是B
  15.                   return y;        
  16.      }
  17. }
复制代码
回复 使用道具 举报
调用operate方法时,传入了两个引用a,b的拷贝x,y,这两个x,y都指向原a,b引用所指向的对象。x.append(y)对它指向的对象(即a指向的对象)进行了操作。而x=y,只是两个拷贝变量在赋值,并没有影响到原b所指向的对象。所以b所指向的对象仍然为B。
回复 使用道具 举报
在这个过程中实际上是单个方法本身对注入的参数的值进行改变,并没有对注入的参数(对象本身)进行改变。所以在其他类方法调用该参数本身是,任然是初始值。在这里值得注意的是:应为StringBuffer()类中的append();insert();delete();reverse();replace()等方法,是可以对对象本进行修改和操作的...

回复 使用道具 举报
本帖最后由 胡大强 于 2012-6-16 22:58 编辑
  1. public class Test{
  2.          public static void main(String[] args){
  3.          StringBuffer a=new StringBuffer("A");
  4.          StringBuffer b=new StringBuffer("B");
  5.          operate(a,b);
  6.          System.out.println(a+","+b);
  7.           }
  8.          public static void operate(StringBuffer x, StringBuffer y){
  9.           x.append(y); //这里被追加了 输出AB
  10.        //  y=x;   //为什么这里没有改变 输出还是B
  11.                  x=y;  //输出还是B。。。说明什么呢?看下面的分析。。。。
  12.   }
  13.          }

  14. //运行结果是  AB,B。。。。。。。。。java的调用是值调用。。。虽然java和C语法有异曲同工之妙,但是他们之间的调用却是不同的。。像c就属于引用调用。

  15. //引用调用相当于传地址,它直接在原来的内存上写数据; 比如,x=1;x=x+1;后  x=2。
  16. // 值调用是把原来的值在另外的内存上复制了一份,函数返回后复制的那一份将消失。x=1;x=x+1;后 这个则为x=1;

  17. ///希望对你有所帮助~!
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马