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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张甲甲 中级黑马   /  2013-5-16 21:23  /  1850 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Foo {
  public static void main (String [] args) {
  StringBuffer a = new StringBuffer ("A");
  StringBuffer b = new StringBuffer ("B");
  operate (a,b);
System.out.println(a+","+b);
  }
  static void operate (StringBuffer x, StringBuffer y) {
  x.append(y);
  y = x;
  }
  }
为什么结果会是AB,B呢?public class Test{
public static void main(String args[]){
   Date d=new Date();
   System.out.println(d);
modify(d);
System.out.println(d);
}
public static void modify(Date d1){
d1=null;
}
}
为什么这样就改变不了d 的值呢?

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

3 个回复

倒序浏览
  1. public class Foo {
  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.   static void operate (StringBuffer x, StringBuffer y) {
  9.   x.append(y);/*append()是对StringBuffer对象进行添加动作,这改变了对象的内容了。所以使得打印 指向该对象的引用变量时 输出发生改变了。*/
  10.   y = x;//形参的改变不影响实参所指向的地址,而且此时实参B所指向的对象内容没发生改变,所以打印输出就没改变喽。
  11.   }
  12.   }
复制代码
下面的d1同理哦 形参d1只是变成空 不指向谁而已 这和实参没啥关系 两者不发生值传递。

(有什么不妥 ,请指正。。。)

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
  static void operate (StringBuffer x, StringBuffer y) {
   x.append(y);    //这里是操作了对象本身, 所以内存中的对象内容, 这时改变了, 方法执行完, 内容已经发生了变化, 所以是AB
   y = x;              //这里是操作了对象的引用, 对象本身没有变, 只是引用变了, 方法执行过后会消失, 所以引用也随之消失(因为y只是个形式参数), 所以还是B
   }
下面的modify方法也是一样的, 因为只是栈空间中的引用改变了(方法是在栈内执行的), 方法结束后就消失了, 所以还是原来的引用指向原来的对象
回复 使用道具 举报
如果问题已解决请再次编辑,改为以解决,方便大家看帖,没有就继续追问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马