《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解惑》系列——02字符谜题--字符串谜题总结
- 《Java解惑》系列——02字符谜题——谜题18:字符串奶酪(new String(byte [] b))
- 《Java解惑》系列——02字符谜题——谜题13:动物庄园(字符串的==和equals)
- 《Java解惑》系列——02字符谜题——谜题23:不劳而获(java编程中的一些常见陷阱)
- python_11(format、转义字符、连接字符、字符串操作函数、字符串反转)
- 《Java解惑》系列——02字符谜题——谜题20、21的感想
- 《Java解惑》系列——02字符谜题——谜题12:ABC(char[]的重载问题)
- 《Java解惑》系列——02字符谜题——谜题20:我的类是什么(string的replaceAll)
- 《Java解惑》系列——02字符谜题——谜题15:令人晕头转向的hello
- 《Java解惑》系列——02字符谜题——谜题16:打印程序
- 《Java解惑》系列——02字符谜题——谜题21:我的类是什么 升级版(string的replaceAll)
- 《Java解惑》系列——02字符谜题——谜题22:URL愚弄(Java中的标号)
- 《Java解惑》系列——02字符谜题——谜题17:嗯??
- 《Java解惑》系列——02字符谜题——谜题14至17(总结)
- 《Java解惑》系列——02字符谜题——谜题19:漂亮的火花(块注释)
- 《Java解惑》系列——02字符谜题——谜题14:转义字符的溃败
- java解惑--谜题11:最后的笑声
- 【python系列】Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
- 每天学习一算法系列(1)(定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部)
- C#系列视频教程-字符和字符串操作