您的位置:首页 > 编程语言 > Java开发

《Java解惑》系列——02字符谜题——谜题11:最后的笑声(字符、字符串连接操作)

2014-04-18 16:52 295 查看

知识点:

在使用字符时,一定要注意字符的连接。‘a’+‘b’。

问题:

下面的程序会打印什么??

// 注意字符的连接
public class LastLaugh{
public static void main(String[] args){
System.out.print("H"+"a");
System.out.print('H'+'a');
}
}

// 期望结果:HaHa
// 实际结果:Ha169


结果是不是出乎大家的意料呢?的确如此。

产生这个结果的原因:

你可能会认为这个程序将打印HaHa。该程序看起来好像是用两种方式连接了H

和 a,但是你所见为虚。如果你运行这个程序,就会发现它打印的是Ha169。那

么,为什么它会产生这样的行为呢?

正如我们所期望的,第一个对System.out.print 的调用打印的是Ha:它的参数

是表达式"H"+"a",显然它执行的是一个字符串连接。而第二个对

System.out.print 的调用就是另外一回事了。问题在于'H'和'a'是字符型字面

常量,因为这两个操作数都不是字符串类型的,所以 + 操作符执行的是加法而

不是字符串连接。

编译器在计算常量表达式'H'+'a'时,是通过我们熟知的拓宽原始类型转换将两

个具有字符型数值的操作数('H'和'a')提升为 int 数值而实现的。从char 到

int 的拓宽原始类型转换是将 16位的 char 数值零扩展到32 位的 int。对于'H',

char 数值是72,而对于'a',char 数值是97,因此表达式'H'+'a'等价于 int

常量72 + 97,或 169。

解决方法:

System.out.print("" + 'H' + 'a');// 用一个空字符串相加

•  预置一个空字符串;  

•  将第一个数值用String.valueOf 显式地转换成一个字符串;  

•  使用一个字符串缓冲区;  

•  或者如果你使用的 JDK 5.0,可以用 printf 方法。 

总结:

这个谜题还包含了一个给语言设计者的教训。操作符重载,即使在 Java 中只在

有限的范围内得到了支持,它仍然会引起混淆。为字符串连接而重载 + 操作符

可能就是一个已铸成的错误。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java解惑
相关文章推荐