我定义了一个char[] a={'a','b','c'}; 
调用System.out.println(a);输出abc 
在定义一个byte[] b={1,2,3}; 
调用System.out.println(b);输出[B@6b97fd 
为什么不是输出123啊?

解决方案 »

  1.   

    char是一个字byte是一个字节  存储方式的位数都不一样。
      

  2.   

    char[]和byte[]都是数组object,char[]里的元素存储在常量池里,而byte[]里的元素存储在内存堆里,前者直接输出元素,后者输出的是byte[]这个数组对象所在的内存值。
      

  3.   

    将程序改写成这个就可以:
    byte b[]={1,2,3};
    for(int i=0;i<3;i++)
    System.out.print(b[i]);
      

  4.   

    回复lovelyhermione() :
    要是按照你的说法我想知道:
    (1)是不是只要是存放在常量池里的数组元素输出的就是元素,在内存堆里的数组元素输出的就是内存值呢?
    (2)什么类型的数组是存放在常量池?什么类型的数组是存放在内存的呢(int[] short[] long[] String[] float[] double[]...)?回复kingkang1() :
    这个我知道,我问题的目的是为什么会输出那样的值,不过也谢谢你^_^.
      

  5.   

    象  char  string 这样的字符,字符串,他们都是放在常量池里面
    char a='x';
    char b=a;
    那么a 和 b 其实共用一个放在常量池里的字符'x',string也是一样(这样设计也许是为了节约空间)
    int a=1;
    int b=a;
    这里a和b在内存里是没任何联系,只是两个内存块里的值是一样,都为1,数值类型的都是至于它们为什么那样输出我也不太清楚,我这个只能解释它们输出结果不一样的原因,呵呵,一起等待高人出现吧
      

  6.   

    概念不清
    System.out 方法输出的时候
    如果是简单类型,会对应的打印出它的实际值,这是方法的重载
    而如果需要输出的是对象(其中,数组在JAVA中就是一种对象),就会调用该类对象的toString方法,也就是说你System.out.println(aArray);的时候,调用的是数组对象的toString方法,而不是如你所想的输出每个元素。
      

  7.   

    回复angelleecash(陈亮) :
    要是按你说的那我上面声明的字符数组他应该是个对象啊,调用Sytem.out.print(a)的话,那么就应该调用toString方法啊,那为什么输出的是字符呢,toString方法应该是输出类名和内存的地址阿?回复lovelyhermione() :
    按照你说的,我现在是这样理解的,不知道对不对:存放在常量池的数据就会输出他们的元素,而在内存堆里的数据则输出内存值,然后你有说:"象  char  string 这样的字符,字符串,他们都是放在常量池里面".  这里我就又有一个问题:String[] s={"a","b","c"};System.out.println(s); 在这我声明了一个字符串数组,他输出又是内存值,元素不是应该存放在常量池中吗?我不知道应该怎样去理解?
      

  8.   

    放在常量池里这点没错
    看来这个不是输出不同的原因了...抱歉
    我也不明白了,帮你顶下回angelleecash(陈亮) ,char和byte都是简单类型啊
      

  9.   

    String[] s={"a","b","c"}
    s定义的是一个数组,它存放了三个元素,系统为它分配了内存空间.而S中放着第一个元素的地址,所以输出一个地址.(好像C++中指针的用法)
    String s="abc",放在常量池中.String[] s={"a","b","c"};放在内在堆中.
      

  10.   

    建议楼主去把代码反编译,看看汇编代码是怎么运作的,这样就可以解决你的疑惑了。我的理解:char[]之所以会正确输出,正如楼上的所说,数组也是对象,而System.out.println()在输出对象的时候,如果这个对象不是String型的,那么自动会调用这个对象的toString()方法,因为char[]本身就是一个字符数组,已经是格式化了的,所以可以输出。byte[]不会输出,是因为,它是一组字节流,字节流并不是字符,它可能是个各种字符,比如说采取不同的编码,它会出现不同的字符,所以,byte[]在没有明确指定它为什么的时候,它并不会正确输出(只是个人理解),尽管它可能也调用toString()方法,但是JVM不一定会认!
      

  11.   

    回复 dragon_up() :
     你说String s="abc",放在常量池中,我从网上看说String s=new String("abc"),不是放在常量池里.那么我想问下 这个String s=new String("abc");System.out.println(s); 为什么不在常量池里输出的也是abc呢?回复lovelyhermione() :
    谢谢你,^_^.ps:原来没注意这个问题的时候感觉还好,现在一问觉得连基础都不会了,:(
      

  12.   

    回复wcj1981(宇宙之神):
    谢谢,我是个初学者,对你说的什么反编译还不知道,所以发到这里,希望大伙帮帮忙,
      

  13.   

    晕死 楼上各位们 不懂不要装懂且听我慢慢道来System.out.println()这个方法并没有以byte[]为参数的overload 方法所以系统认为 byte[]是一个object所以调用System.out.println(Object obj)而打印的是obj.toString()而obj.toString()toString 方法返回一个字符串,由类名和 标记符“@”和此对象哈希代码的无符号十六进制表示组成。回答完毕分分拿来 (严重csdn问了问题不给分得朋友)