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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨洋 初级黑马   /  2012-8-2 14:40  /  2133 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Example
{
String str = new String("good");
char[] ch = {'a','b','c'};
public static void main(String args[])
{
  Example ex = new Example();
  ex.change(ex.str,ex.ch);
  System.out.println(ex.str+";;;;"+ex.ch);      //结果是:good;;;;[C@110003
  System.out.println(ex.ch);                           //结果是:gbc
}
public void change(String str,char ch[])
{
  str="test ok";
  ch[0]='g';
}
}

为什么两个结果不一样?

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 加油!

查看全部评分

7 个回复

倒序浏览
本帖最后由 李东升 于 2012-8-2 15:21 编辑

你从输出结果可以看出,第一个输出的是字符数组的地址,第二个是内容。
你把代码改成如下,会看到两个输出的都是地址,。
  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.println(ex.str+";;;;"+ex.ch);      //结果是:good;;;;[C@110003
  10.   System.out.println(ex.ch+"");                           //结果是:;;;;[C@110003
  11.   }
  12. public void change(String str,char ch[])
  13. {
  14.   str="test ok";
  15.   ch[0]='g';
  16. }
  17. }

复制代码
这是因为你在输出数组加上""的话,就会跟调用了toString()方法一样,数组调用toString()方法输出的就是地址了、
回复 使用道具 举报
其实直接根据两个的不同点就能看出来,一个直接输出,一个是加上了字符串后输出,
而任何数据类型加上字符串都会 转化成字符串。
基本数据类型如 1+"a"后会得出 “b” ASCII值。
引用数据类型如 数组+“”后会得到 哈希码值。
回复 使用道具 举报
本帖最后由 轻尘一笑 于 2012-8-2 16:41 编辑

事情是这样的:
public void change(String str,char ch[])
{
  str="test ok";
  ch[0]='g';
}
这方法进栈
会新生成一个 String类型的变量 str 然后就接收实参数对象引用,再然后指向堆中的新对象test ok方法执行完毕 str释放,原来的对象并未被改变
而char ch[] 接受了一个对象的引用,然后操作该对象将下标为0的元素赋值为'g' 方法执行完毕 ch变量释放,原来对象已经被改变
执行ex.change(ex.str,ex.ch);
str的值没变,而数组的第0个位置已经变成g
所以:
System.out.println(ex.str+";;;;"+ex.ch); //结果是:good;;;;[C@110003      ex.ch因为有跟字符串相连所以是toString返回值
System.out.println(ex.ch);                      //结果是:gbc                                 ex.ch在这里使用的是public void println(char[] x)所以打印出来的是元素值

public void println(char[] x)原码如下:
    public void println(char x[]) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }
回复 使用道具 举报
谢谢,已解决
回复 使用道具 举报
问题已经解决
回复 使用道具 举报
[img]D:\[内存分析.bmp这个分析图可以很好的解决你的问题了。
回复 使用道具 举报
这个能很好的解释了

内存分析.png (807.48 KB, 下载次数: 61)

内存分析.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马