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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘晓康 中级黑马   /  2012-4-4 22:19  /  1998 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么 char []  chs = {'2','1'};    可以直接用System.out.priint(chs);输出数组元素

而  int [] arr = {2,1};  用System.out.priint(arr);  输出的 却是地址

char  不是用是引用的对内存里面的数据么  为什么能直接输出值?

8 个回复

倒序浏览
本帖最后由 黄长利 于 2012-4-4 22:36 编辑

这个在后面讲到System类的时候有讲到,
是因为System类的out方法调用了java IO包中的 PrintStream类中的println(char[] s),
所以字符型数组可以直接打印出数组元素
而在PrintStream类中没有println(int[] s)方法,所以不能直接打印整型数组元素。
回复 使用道具 举报
char []  chs = {'2','1'};      
System.out.priint(chs);
输出的时候是调用的printStream的print(char s)方法  
public void print(char[] s)打印字符数组。按照平台的默认字符编码将字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。
回复 使用道具 举报
本帖最后由 孙利川 于 2012-4-4 22:59 编辑

这个应该与print方法有关系吧,print方法有几个重载方法,当传入的参数是字符数组时会输出其值,而对于其它数组则会输出数组对象的toString()方法的返回值。

public void print(char[] s)打印字符数组。按照平台的默认字符编码将字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。
public void print(Object obj)打印对象。按照平台的默认字符串编码将 String.valueOf(Object) 方法生成的字符串转换为字节,并完全以 write(int) 方法的方式写入这些字节。

而String.valueOf(Object) 方法输出的就是Object.toString()的返回值。
回复 使用道具 举报
楼主在验证一下,我看不到这种现象。  两个代码输出都是地址!
class Demo
{
        public static void main(String[] args)
        {
                int[]  arr=  {1,2};
                char[] chs  ={'1','2'};
                System.out.println("int="+arr);
                System.out.println("char="+chs);       
        }
}
回复 使用道具 举报
王永旺 发表于 2012-4-4 23:12
楼主在验证一下,我看不到这种现象。  两个代码输出都是地址!
class Demo
{

int[]  arr=  {1,2};
                char[] chs  ={'1','2'};
                System.out.println("int="+arr);
                System.out.println("char="+chs);  你这边加上了“+”字符串连接符,已经被自动转化为字符串,与楼主问的单个字符不是一回事, 要把 System.out.println("char="+chs);  改成 System.out.println(chs);   
回复 使用道具 举报
程旦 来自手机 中级黑马 2012-4-4 23:47:49
7#
其实各位讲的很清楚了,就是print方法重载了。。楼主去看看jdk文档就行了
回复 使用道具 举报
public void println(char x[]) {//当传char数组时候的源码
        synchronized (this) {
            print(x);
            newLine();
        }
public void print(char s[]) {
        write(s);
    }
private void write(char buf[]) {
        try {
            synchronized (this) {
                ensureOpen();
                textOut.write(buf);
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush) {
                    for (int i = 0; i < buf.length; i++)
                        if (buf[i] == '\n')
                            out.flush();
                }
            }
        }
将数组的数遍历出来
回复 使用道具 举报
1:输出字符串型数组System.out.priint(chs)时,系统调用的是printStream的print(char s)方法;
默认字符编码将字符转换为字节,可以直接输出这些数组元素;
2:而输出数组元素System.out.priint(arr)这种方法是不行的,系统没有提供这种变换,
直接打印出的是这个数组对应的哈希内存值的。
另:这种输出
System.out.println("char="+chs);也是输出不到的 ,“+”造成的字符串连接的输出还是char和内存,
与System.out.println(chs)直接输出字符串数组元素是不一样的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马