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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 何仕映 于 2013-3-15 09:28 编辑

根据比老师讲的建立一个数组 int[] a = {1,3,5};其中a是一个引用型变量存在于栈内存中,其中装得值是该数组在堆内存中的首地址。如果打印a这个引用型变量,那么输出的就是该数组在堆内存中的地址值。如果是这样,那么所有的数组应该都是这种思想。但是为什么会出现下面程序中的这种结果呢?打印字符数组的引用型变量,如果前面用+连接一个字符串打印的是地址值,如果打印语句中只有这个引用型变量,那么打印的就是该数组中的内容。请问为什么会这样啊?
  1. class Arr1Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 char[] a = {'a','b','c'};                //定义两个字符数组,一个赋有初值。另一个至开辟空间,采用默认值。
  6.                 char[] b = new char[3];

  7.                 int[] c = new int[3];                        //定义两个整型数组,一个赋有初值。另一个至开辟空间,采用默认值。
  8.                 int[] d = {1,2,3,4,5};

  9.                 System.out.println("a = "+a);        //打印引用型变量。
  10.                 System.out.println("b = "+b);
  11.                 System.out.println("c = "+c);
  12.                 System.out.println("d = "+d+"\n"+"\n"+"\n");

  13.                 System.out.println(a);
  14.                 System.out.println(b);
  15.                 System.out.println(c);
  16.                 System.out.println(d);
  17.         }
  18. }
  19. /*
  20. 运行结果
  21. =======================================
  22. a = [C@de6ced
  23. b = [C@c17164
  24. c = [I@1fb8ee3
  25. d = [I@61de33



  26. abc

  27. [I@1fb8ee3
  28. [I@61de33
  29. =======================================
  30. */
复制代码

点评

如果问题已经解决了,请将分类改为已解决,谢谢  发表于 2013-3-15 08:34

评分

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

查看全部评分

9 个回复

倒序浏览
以前我也遇到你这个问题,然后查找发现是print方法底层实现的问题。
建议你去看看print方法实现的源代码!

如果为char数组,那么打印出来的是它内容的拼接起来的数据。
如果是其它类型的数组,他会先强制转成String,就是使用String.valueOf(参数)方法,然后你直接打印,那么打印的就是一串地址了!
回复 使用道具 举报
沉默de羔羊 发表于 2013-3-14 09:38
以前我也遇到你这个问题,然后查找发现是print方法底层实现的问题。
建议你去看看print方法实现的源代码!
...

谢谢你。你的学习态度让我钦佩。你的QQ是多少啊,我能加你吗?有什么问题,我们可以直接讨论。
回复 使用道具 举报
何仕映 发表于 2013-3-14 09:41
谢谢你。你的学习态度让我钦佩。你的QQ是多少啊,我能加你吗?有什么问题,我们可以直接讨论。 ...

QQ:494105019
验证问题:岳涛
我现在还在公司上班,有时候,可能不能及时回答你问题,要见谅啊!
回复 使用道具 举报
print方法 打印数组只有是char型的
  1. public void print(char s[]) {
  2.         write(s);
  3.     }
复制代码
  1.   private void write(char buf[]) {
  2.         try {
  3.             synchronized (this) {
  4.                 ensureOpen();
  5.                 textOut.write(buf);
  6.                 textOut.flushBuffer();
  7.                 charOut.flushBuffer();
  8.                 if (autoFlush) {
  9.                     for (int i = 0; i < buf.length; i++)
  10.                         if (buf[i] == '\n')
  11.                             out.flush();
  12.                 }
  13.             }
  14.         }
  15.         catch (InterruptedIOException x) {
  16.             Thread.currentThread().interrupt();
  17.         }
  18.         catch (IOException x) {
  19.             trouble = true;
  20.         }
  21.     }
复制代码
如果数组不是char型的,就只打印这个引用的字符形式。

评分

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

查看全部评分

回复 使用道具 举报
张栓紧 发表于 2013-3-14 09:51
print方法 打印数组只有是char型的如果数组不是char型的,就只打印这个引用的字符形式。 ...

我补全一点,如果不是char[]数组,他会调用如下的方法:
void print(Object obj) ,然后就是我上面的说的转型问题了!
回复 使用道具 举报
张栓紧 发表于 2013-3-14 09:51
print方法 打印数组只有是char型的如果数组不是char型的,就只打印这个引用的字符形式。 ...

谢谢,能告诉我为什么用整数加上一个字符,打印的结果是整数呢?为什么不是字符串而是这个字符的ASCII参与运算呢?
回复 使用道具 举报
可以重写打印的方法。然后打印的时候调用,想怎么显示这个方法就怎么写。

///如下面:
public static void printInt(int[] arr){//printInt打印的方法
                for(int i=0;i<arr.length;i++){
                        if(i!=arr.length-1){
                                System.out.print(arr[i]+",");
                        }
                        else
                                System.out.println(arr[i]);
                               
                       
                }
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马