求char[]+String字符串输出的是什么?

threedong 2015-09-23 09:16:24
char[] ch={'a'};
String str="b";
System.out.println(ch+str);
为什么打出的是地址+字符串??
而不是纯字符串?
...全文
148 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
解开者 2015-09-24
  • 打赏
  • 举报
回复
把其他东西和String用+运算会依次调用它们的toString方法 System.out.println(new String(ch) + str);可以输出ab
zhuangqingch 2015-09-23
  • 打赏
  • 举报
回复
在java中,Sytem.out.println()底层调用的是PrintStream的println()操作,PrintStream的println()操作提供也很多重载方法,如下图:

下面通过prinln()做一些测试及解释,代码如下:

/**
* @author zhuangqing
*/
public class Test {
public static void main(String[] args) {
char[] c = {'c'};
MyObj obj = new MyObj();
String str = "hello";
System.out.println(c);//将输出c

// System.out.println(c + obj);//非String对象之间不允许+操作

/**
* 数组底层实现也是一个java类对象(JVM级别的类,API找不到的)
* 非String对String对象操作,将调用非String对象的toString方法(数组对象的toString结果就是楼主看到的地址描述))转为String与String做+操作
* +操作底层是调用StringBuilder做append操作
*/
System.out.println(c+str);
System.out.println(obj + str);
}
}
class MyObj {

}

另外说明下,数组是一个对象。println()方法 中有println(char[] c) 和println(Object c)2个方法 。根据java的方法调用参数类型自下向上适配的特性,会选择调用println(char[] c)。而println(char[] c)底层是通过BufferWriter的witer()实现的,如下代码:

private BufferedWriter textOut;
private void write(String s) {
try {
synchronized (this) {
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush && (s.indexOf('\n') >= 0))
out.flush();
}
}
threedong 2015-09-23
  • 打赏
  • 举报
回复
引用 1 楼 doujinlong1 的回复:
因为你把字符数组输入进去了。。。。所以会有地址,你这么输出就是你想要的
System.out.println(ch[0]+str);
那我要是单纯的输出char[] 数组,输出的就是字符,感觉没到重点
  • 打赏
  • 举报
回复
主要原因在于数组名就是地址,而数组加下标才是那个字符,字符+字符串才是字符串
  • 打赏
  • 举报
回复
因为你把字符数组输入进去了。。。。所以会有地址,你这么输出就是你想要的
System.out.println(ch[0]+str);

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧