2 galaxy wzs Galaxy_wzs 于 2016.05.03 21:02 提问

java新手关于字符数组的问题

对于这段代码:
public class Stringtest01
{
public static void main(String[] args)
{
char[] charArray = {'e','f','g','h'};

System.out.print("charArray:");
System.out.println(charArray);

System.out.println("charArray:"+ charArray);
System.out.println("charArray.toString():"+charArray.toString());
}
}
控制台输出结果如下:
charArray:efgh
charArray:[C@b5dac4
charArray.toString():[C@b5dac4

问题:为什么第二、三行的输出结果在使用了+以后就会出现似乎调用toString()的情形呢?而第一行直接在system.out.println()中调用charArray就不会这样子?请大神们指教,谢谢!

3个回答

havedream_one
havedream_one   2016.05.04 09:03
已采纳

System.out.println(charArray); 调用的重载方法是
public void println(char[] x)
打印字符数组,然后终止该行。此方法的行为就像先调用 print(char[]) 然后调用 println() 一样。

System.out.println("charArray:"+ charArray);
System.out.println("charArray.toString():"+charArray.toString()); 调用的重载方法是
public void println(String x)
打印 String,然后终止该行。此方法的行为就像先调用 print(String) 然后调用 println() 一样。
+在这里时字符串连接符,需要先运算这个“+”,所以调用了toString()

w172087242
w172087242   Ds   Rxr 2016.05.03 21:36

print方法对char类型的数组进行了特殊处理,所以输出为efgh;

但是当你调用+的时候,这时候print接收的参数就不是一个char[],而是String,
因为字符串与对象的+操作符就是调用对象的toString,
数组的toString就是类型+@+hashCode的十六进制,所以这时候输出的就是奇怪的地址。

你可以进入System.out中的print方法和println方法对char[]数组的操作源码,很简单的。

希望我的回答能帮到你,如果有帮助,也希望你能结贴。

bdmh
bdmh   Ds   Rxr 2016.05.03 21:05

第二个会做一个隐式的转换,要让他们以一致的类型做运算

liven0917
liven0917 回复Galaxy_wzs: 我也新手,不知道我回答的对不对,因为第一个是直接输出的 字符 类型 char,第二个输出的是字符串类型String + char类型,会有一个隐身转换,第三个调用toString方法也是一样的道理.
大约 2 年之前 回复
Galaxy_wzs
Galaxy_wzs 第一个输出是不是调用了toString方法呢?为什么第一个不需要做隐式的转换?
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于字符数组的长度问题
为什么结果会是这样呢?按照我的理解呢就是: C语言中没有字符数组的这个概念,对于字符型的数组,其实C语言还是把它们当成了单个字符串来看待的,只是用了一个结尾的标志'\0'来标志一下表示该结束了,所以用这样的方法来限制长度,所以貌似是一个字符串。由于,没有字符数组的概念,所以正常的情况来讲,就应该把字符一个一个地赋给数组的每一个单位,但是这样效率有很低下,所以才出现了这样的形式:char cB
关于字符数组赋值问题
1:结构体中定义字符数组并赋值 先看一段错误的代码 struct stype {     char c1[16] }; struct stype s1; s1.c1 = "Hello"; //错误 这是很幼稚的概念错误,char c2[10]声明一个10元素的数组c2,此时c2的空间已经被分配,c2是这个数组的地址,是一个常量,如果再进行 c2 = “hello"
C Java 字符串和字符数组区别
1. C 语言   在C语言中字符串和字符数组基本上没有区别,都需要结束符;如:char s[4]={'a','b','c','d'};此字符数组的定义编译可以通过,但却没有关闭数组,若其后需要申请内存,那么以后的数据均会放入其中,尽管它的长度不够,但若为 char s[5]={'a','b','c','d'};则系统会自动在字符串的最后存放一个结束符,并关闭数组,说明字符数组是有结束符的;
关于冒泡法与二维字符数组比较问题
#include #include void main() { char a[1000],b[100][30],tmp[100]; int i,j=0,k=0,d,m=0,n=0; gets(a); for(i=0;a[i]!='\0';i++) { if(a[i]!=' '||a[i]!=',') { b[k][j]=a[i]; j++; } if(a[i]=='
java新手何去何从?
   从不懂软件编程是什么,到现在的java新手,觉的是自己懂了不少,可是到了找工作的时候就头疼了,java的要求太高了,工作经验要的很高,不知道是公司再故作玄虚,还就是那么回事,一起的同学,学net的很多,说是net好找,java难找,也确实是那么回事。   那些公司都要java老手,那那些新手该去哪?哎   还是努力找工作吧,再加上没学历,真的很难啊。
一个JAVA新手问题,关于setName和getName
package com.edu.ch7; public class Book { private String name; public String getName(){ //获取属性 int id = 0; setName("java"); return id+this.name; } public void setName(String name){ /
关于java上传的问题
关于java上传的问题关于java上传的问题关于java上传的问题
Java新手问题汇总
作java有段时间了,想想自己曾经走过的路,很多知识点都涉及到过,于是收藏这个帖子。给新人看也给自己看。原贴地址:http://www.matrix.org.cn/thread.shtml?topicId=910&forumId=19Helloworld功略http://www.matrix.org.cn/forum_view.asp?forum_id=19&view_id=84我的入
java新手问题
1      环境变量的配置可能会不全,导致javac和java的时候报错,无法加载类 解决办法:检查环境变量的配置是否完整 新增JAVA_HOME,对应值是安装目录 新增classpath,值是  %JAVA_HOME%\bin;%JAVA_HOME%\bin\tools.jar; 添加path,值  %JAVA_HOME%\lib; 2    编写运行applet的时候会 警告:不能
Java新手问题集锦
文章转载自:http://it.deepinmind.com/java/2015/07/21/java-programming-tips-best-practices-beginners.html Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在。 有超过30亿的