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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请看下面的代码,打印一个对象的引用应该是输出此对象的地址值,但是为什么输出arr2结果却不是这样?
public class Text11 {
        public static void main(String[] args) {
                String s1 = "abcde";
                char[] arr2 = s1.toCharArray();
                System.out.println(arr2);  //应该也是地址才对,为什么会输出"abcde"?
                System.out.println(s1);   //这个是字符串
        }
}

9 个回复

倒序浏览
不是很清楚,String类拿出来操作的话应该是创建一个新的对象,如果在原有类上操作的话原String类会改变,这肯定不行。假设它使用.toCharArray()方法创建了一个新对象,这个对象还是字符串数组,那输出它的是地址还是字符串呢?我觉得这和String s1的输出原理是一样的( System.out.println(s1);   ),输出字符串数组名就是输出原有的字符串。
回复 使用道具 举报
s1也是对象的引用啊,按照你的逻辑,打印s1也应该是地址值才对。既然两个都不是地址值,可能是print()方法的重载问题,print()方法当参数是arr类型或string类型时,将不再打印地址值。。。。不知道理解的对不对,求大神指教。。
回复 使用道具 举报
因为println打印字符数组时没有调用toString方法.
回复 使用道具 举报
因为输出流System.out是PrintStream对象,PrintStream有多个重载的println方法,其中一个就是public void println(char[] x),直接打印字符数组的话,不像int[]等其他数组,它会直接调用这个方法来打印,因而可以打印出数组内容,而不是地址。具体的话你可以看下API和源码,只有字符数组才会这样
回复 使用道具 举报
太子奕 发表于 2015-10-3 10:39
不是很清楚,String类拿出来操作的话应该是创建一个新的对象,如果在原有类上操作的话原String类会改变,这 ...

感觉应该是这样,字符串数组和String s1 输出原理相同,至于原因却不清楚
回复 使用道具 举报
15001162522 发表于 2015-10-3 10:40
s1也是对象的引用啊,按照你的逻辑,打印s1也应该是地址值才对。既然两个都不是地址值,可能是print()方 ...

两个都不是地址值我想他们的原理可能是相同的,也许真如你说的一样是print方法的重载问题,这个等我下去研究研究。我之所以对打印字符数组有疑问,主要是因为打印int型的数组时的结果是地址值,类比一下,似乎字符数组的打印也应该是地址值,但结果出乎意料,这个问题还得研究
回复 使用道具 举报
月影千华 发表于 2015-10-3 10:41
因为println打印字符数组时没有调用toString方法.

为什么会这样,能具体说说吗?
回复 使用道具 举报
风语 发表于 2015-10-3 10:58
因为输出流System.out是PrintStream对象,PrintStream有多个重载的println方法,其中一个就是public void p ...

谢谢,了解了,一语中的,说的太好了
回复 使用道具 举报
风语 发表于 2015-10-3 10:58
因为输出流System.out是PrintStream对象,PrintStream有多个重载的println方法,其中一个就是public void p ...

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