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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高贵杰 中级黑马   /  2013-3-11 16:52  /  2079 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高贵杰 于 2013-3-11 20:58 编辑

这段代码是很简单的输出语句,但是两个字符用“+”连接输出,转化为int类型数值输出相加结果。
但是什么在输出语句中加入双引号连接字符输出的就是字符串连接。请各位大神帮忙解答。


public class StringDemo {
public static void main(String[] args) {
  
  System.out.println(""+'H'+'a');//输出 Ha
  System.out.print('H'+'a');//输出 169
}
}

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 李辉 于 2013-3-11 17:05 编辑

原因是这样的: 第一句里面,""+'H'+'a' 当然先运算""+'H',然后运算结果+'a',""+'H'在运算时,是字符串加字符,会把字符加在字符串后面,结果还是个字符串,再运算+'a',当然得到Ha
第二句'H'+'a' 是两个字符相加,字符不能用加法操作符,所以默认先转成了int型。

第一句实际上是先把H变成字符串,再跟空字符串相加的,字符串重载了加法操作符,是可以直接相加的。

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
加了双引号就强制转换成了 String 类型。。。
开发中经常使用该方法进行类型转换。。方便快捷。。{:soso_e113:}
回复 使用道具 举报
李辉 发表于 2013-3-11 17:00
原因是这样的: 第一句里面,""+'H'+'a' 当然先运算""+'H',然后运算结果+'a',""+'H'在运算时,是字符串加字 ...

正解

运算顺序从左到右

如果是 System.out.println('H'+'a'+"");//也是输出169
回复 使用道具 举报
本帖最后由 张学林 于 2013-3-11 17:14 编辑

当字符串和其他数据用+号连接的时候,JVM会把其他数据自动转成字符串(也可以按毕老师讲的来理解,Java是由左向右执行的,当看到有个String,把它看成是好几两的碗来看,因为String里可以放很位的东西嘛,不止四两了,你向这个碗里放东西,其他的东西也都转成是这个(String)好几两的碗了)
字符在JVM里就是ASCII码值,也就是两个0-127内的数值在相加
回复 使用道具 举报
原因:1. 关键是你要知道字符是可以参加数值运算的,所以输出的是字符的数值进行的十进制运算。
      2.在System.out.println()控制台输出中"  "+...这是一个字符串拼接,所以输出的还是字符串。
回复 使用道具 举报
张宁 中级黑马 2013-3-11 17:19:32
7#
楼上基本回答了你的问题,所以 'H'+'a'是他们的ascii码相加的结果,如果想输出Ha,那你把H 和 a 单引号改成双引号,转换成字符串相加就好了。
回复 使用道具 举报
""是字符串,'H'和'a'是字符,""+'H'的结果还是字符串,再+'a'结果就是字符串Ha了。
回复 使用道具 举报
本帖最后由 克零岚 于 2013-3-11 19:36 编辑

使用字符串连接操作符使用格外小心。+ 操作符当且仅当它的操作数中至少有一个是String类型时,才会执行字符串连接操作;否则,它执行的就是加法。
(执行加法的情况是,编译器在计算常量表达式'H'+'a'时,是通过我们熟知的拓宽原始类型转换将两个具有字符型数值的操作数('H'和'a')提升为int数值而实现的。从char到int的拓宽原始类型转换是将16位的char数值零扩展到32位的int。对于'H',char数值是72,而对于'a',char数值是97,因此表达式'H'+'a'等价于int常量72 + 97,或169。)
如果要连接的没有一个数值是字符串类型的,那么你可以有几种选择:

(1)预置一个空字符串;例如你写的这行代码:System.out.println(""+'H'+'a');
(2)将第一个数值用String.valueOf显式地转换成一个字符串;
(3)使用一个字符串缓冲区;例如下面:
StringBuffer sb = new StringBuffer(); sb.append('H');
sb.append('a');
System.out.println(sb);

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1 赞一个!

查看全部评分

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