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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘云龙 中级黑马   /  2013-3-4 23:30  /  1975 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Question
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 char[] arr = {'a','b','c','d','e'};
  6.                 System.out.println(arr);//打印abcde
  7.                 int [] arr1 = {1,2,3,4,5};
  8.                 System.out.println(arr1);//打印[I@5e55ab

  9.         }
  10. }
复制代码
结果是
abcde
[I@5e55ab
为什么字符数组不是打印的数组的地址?

评分

参与人数 1黑马币 +6 收起 理由
黄玉昆 + 6 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 李志卫 于 2013-3-5 02:23 编辑

特别优待
看下面代码,你会发现char[]数组并没有重写toString方法
  1. class Test14
  2. {
  3. public static void main(String[] args)
  4. {
  5. String s = "abc";
  6. byte[] b = s.getBytes();
  7. System.out.println(b.toString());
  8. System.out.println(new String(b));

  9. char[] arr = {'a','b','c','d','e'};

  10. System.out.println(arr);
  11. System.out.println(arr.toString());   // 结果是 [C@1fc4bec

  12. int [] arr1 = {1,2,3,4,5};

  13. System.out.println(arr1.toString());






  14. }
  15. }
复制代码
回复 使用道具 举报
本帖最后由 门文通 于 2013-3-5 02:37 编辑

输出语句会调用toString方法。Object类中的toString方法返回值为  getClass().getName() + '@' + Integer.toHexString(hashCode())   
而字符数组中的 toString方法被复写了,返回的为String对象。所以可以abcde。   


这是错的   

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
      我猜想是因为字符数组的定义里面override了toString方法,而整数数组没有override。我试图从api文档里找出答案,可是那里面好像没有。
   
回复 使用道具 举报
刚才我说的不对  误人子弟了   我又查了下
API在print方法中有这样的说明

print

public void print(char[] s)
打印字符数组。按照平台的默认字符编码将字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。
参数:
s - 要打印的字符数组
抛出:
NullPointerException - 如果 s 为 null

这才是为什么会打印abcde的原因
回复 使用道具 举报
通过百度搜到:
看完这两个例子你就会明白了
例1

public class LastLaugh{

public static void main(String[] args){

System.out.print("H"+"a");

System.out.print('H'+'a');

}
}
运行结果是Ha169,不是HaH

+ 操作符当且仅当它的操作数中至少有一个是String类型时,才会执行字符串连接操作;否则,它执行的就是加法。

例2

总结:String.valueOf、StringBuffer.append以及System.out.print中都对char[]数组单独处理,即进行了重载,使之可以输出内容(或者对内容操作处理),而不是地址。

但是字符串拼接操作没有对char[]数组单独处理,所以它处理的是数组char[]的地址

public class ABC{

public static void main(String[] args){

String letters = "ABC";

char[] numbers = {'1', '2', '3'};

System.out.println(letters + " easy as " + numbers);

}
}
程序输出:ABC easy as [C@16f0472,而不是ABC easy as 123。




评分

参与人数 1黑马币 +6 收起 理由
黄玉昆 + 6 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马