黑马程序员技术交流社区

标题: java值传递和地址传递的问题 [打印本页]

作者: 张甲甲    时间: 2013-5-16 21:23
标题: java值传递和地址传递的问题
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 的值呢?
作者: chouwayメ    时间: 2013-5-16 22:17
  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只是变成空 不指向谁而已 这和实参没啥关系 两者不发生值传递。

(有什么不妥 ,请指正。。。)
作者: breeze    时间: 2013-5-18 08:41
  static void operate (StringBuffer x, StringBuffer y) {
   x.append(y);    //这里是操作了对象本身, 所以内存中的对象内容, 这时改变了, 方法执行完, 内容已经发生了变化, 所以是AB
   y = x;              //这里是操作了对象的引用, 对象本身没有变, 只是引用变了, 方法执行过后会消失, 所以引用也随之消失(因为y只是个形式参数), 所以还是B
   }
下面的modify方法也是一样的, 因为只是栈空间中的引用改变了(方法是在栈内执行的), 方法结束后就消失了, 所以还是原来的引用指向原来的对象
作者: 曹睿翔    时间: 2013-5-19 07:47
如果问题已解决请再次编辑,改为以解决,方便大家看帖,没有就继续追问




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2