黑马程序员技术交流社区

标题: 为什么输出是这个呢 [打印本页]

作者: taoge    时间: 2013-12-22 18:43
标题: 为什么输出是这个呢
  1. public class Example
  2. {
  3.         String str = new String("good");
  4.         char[] ch = { 'a', 'b', 'c' };

  5.         public static void main(String args[])
  6.         {
  7.                 Example ex = new Example();
  8.                 ex.change(ex.str, ex.ch);
  9.                 System.out.print(ex.str + " and ");
  10.                 System.out.println(ex.ch);
  11.         }

  12.         public void change(String str, char ch[])
  13.         {
  14.                 str = "test ok";
  15.                 ch[0] = 'g';
  16.         }
  17. }
复制代码
为什么输出是good and gbc呢?change方法为什么只改变了ch的值?

作者: panzhenglian    时间: 2013-12-22 19:21
准确的说  change方法只改变了ch零角标位的值,,代码中改变的str值改变的只是change方法中局部变量str的值,正确的做法是在change方法的str前面加上this,代表使用这个方法的对象引用,比如这样,输出就成了test ok and gbc
  1. public class Example
  2. {
  3.         String str = new String("good");
  4.         char[] ch = { 'a', 'b', 'c' };

  5.         public static void main(String args[])
  6.         {
  7.                 Example ex = new Example();
  8.                 ex.change(ex.str, ex.ch);
  9.                 System.out.print(ex.str + " and ");
  10.                 System.out.println(ex.ch);
  11.         }

  12.         public void change(String str, char ch[])
  13.         {
  14.                 this.str = "test ok";
  15.                 ch[0] = 'g';
  16.         }
  17. }
复制代码

作者: smileven    时间: 2013-12-23 03:14
这个是参数传递过程中的问题。
ex.str是将str的值赋给了change函数中的字符串str。
    所以change操作修改的只是内存中新建的属于change函数的str的值,
    在函数操作完成退出时这个临时建立的变量str是会自动释放的,并没有保存为ex.str的值。


ex.ch是将字符数组的引用传给了change函数中的字符数组ch。
    传引用和传值的区别就在这儿了。
    如果把ch的引用传递个change中的ch。那么两个ch指向的是同一个字符数组,也就是main函数中创建的ch数组。
    所以change操作修改的内存区域是main中ch的内存区域,所以change操作完成退出时,main中ch的值被修改了。


如果还不理解建议看一下C++中参数传递过程中传值和传引用的区别,java中对这个的介绍不是很清楚。





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