`

java解惑 - 最后的笑声

    博客分类:
  • Java
阅读更多
下面的程序将打印出什么呢?

public class LastLaugh{
    public static void main(String[] args){
        System.out.print("H"+"a");
        System.out.print('H'+'a');
    }
}


你可能会认为这个程序将打印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。

站在语言的立场上,若干个char和字符串的相似之处是虚幻的。语言所关心的是,char是一个无符号16位原始类型整数——仅此而已。对类库来说就不尽如此了,类库包含了许多可以接受char参数,并将其作为Unicode字符处理的方法。

那么你应该怎样将字符连接在一起呢?你可以使用这些类库。例如,你可以使用一个字符串缓冲区:

StringBuffer sb = new StringBuffer();
sb.append('H');
sb.append('a');
System.out.println(sb);


这么做可以正常运行,但是显得很丑陋。其实我们还是有办法去避免这种方式所产生的拖沓冗长的代码。 你可以通过确保至少有一个操作数为字符串类型,来强制 + 操作符去执行一个字符串连接操作,而不是一个加法操作。这种常见的惯用法用一个空字符串("")作为一个连接序列的开始,如下所示:

System.out.println("" + 'H' + 'a');


这种惯用法可以确保子表达式都被转型为字符串。尽管这很有用,但是多少有一点难看,而且它自身可能会引发某些混淆。你能猜到下面的语句将会打印出什么吗?如果你不能确定,那么就试一下:

System.out.print("2 + 2 = " + 2+2);


如果使用的是JDK 5.0,你还可以使用

System.out.printf("%c%c", 'H', 'a');


总之,使用字符串连接操作符使用格外小心。+ 操作符当且仅当它的操作数中至少有一个是String类型时,才会执行字符串连接操作;否则,它执行的就是加法。如果要连接的没有一个数值是字符串类型的,那么你可以有几种选择:

预置一个空字符串;
将第一个数值用String.valueOf显式地转换成一个字符串;
使用一个字符串缓冲区;
或者如果你使用的JDK 5.0,可以用printf方法。
这个谜题还包含了一个给语言设计者的教训。操作符重载,即使在Java中只在有限的范围内得到了支持,它仍然会引起混淆。为字符串连接而重载 + 操作符可能就是一个已铸成的错误。
  • java解惑.zip (297.3 KB)
  • 描述: java中最容易被忽略的地方.
  • 下载次数: 19
分享到:
评论
6 楼 justjavac 2010-04-11  
beyondqinghua 写道
这个比较基础!

编程从基础开始。看了这篇文章,我才发现,我连基础都不会。
5 楼 justjavac 2010-04-11  
fins 写道
楼主打算把那本书里的东西都写到博客里??

工作量不小啊

不过要是都能弄进去 整理成pdf 应该很有价值

加油

写出来给大家分享。
4 楼 fins 2008-03-24  
楼主打算把那本书里的东西都写到博客里??

工作量不小啊

不过要是都能弄进去 整理成pdf 应该很有价值

加油
3 楼 xjtusaber 2008-03-24  
嗯   比较明显
2 楼 beyondqinghua 2008-03-24  
这个比较基础!
1 楼 rabbitbug 2008-03-24  
这个比较明显的

相关推荐

    java解惑--疑难问题解疑

    本文将针对"java解惑--疑难问题解疑"的主题,对一些常见的Java疑难问题进行详细解析,旨在帮助初学者更好地理解和解决这些问题。 1. **内存管理与垃圾回收**:Java通过自动垃圾回收机制来管理内存,这为开发者减轻...

    java解惑-语法细节介绍

    ### Java解惑——语法细节介绍 #### 概述 Java作为一种广泛应用的编程语言,拥有庞大的用户群体和丰富的应用场景。在日常开发过程中,我们往往会遇到一些容易忽视却又十分重要的语法细节。这些细节虽然不起眼,但...

    JAVA解惑-Pg285.pdf

    表达式之谜,符号之谜,循环之谜,异常之谜,类之谜,库之谜,各种谜题。

    java 解惑 java 解惑 java 解惑

    java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑

    Java解惑(中文版)_java_java解惑_solve65p_

    《Java解惑(中文版)》是一本专为Java初学者设计的学习资料,旨在帮助读者解答在学习Java过程中遇到的各种困惑。"solve65p"可能代表这本书包含65个问题或主题,每个都深入浅出地进行了讲解,旨在解决初学者在编程...

    Java学习利器-JAVA解惑

    然而,学习Java的过程中,初学者或经验丰富的开发者都可能会遇到一些棘手的问题,这就是"Java学习利器-JAVA解惑"想要解决的问题。 这份名为"JAVA解惑"的PDF文档,可能是由一位经验丰富的Java开发者或者教育者编写的...

    最新版的Java-解惑

    《Java解惑》是一本专为Java初学者和进阶者设计的指南,旨在帮助读者解决在学习和实践中遇到的各种问题。这本书深入浅出地解析了Java编程中的常见困惑,涵盖了语言基础、类库应用、多线程、网络编程、异常处理、内存...

    JAVA 解惑 java经典

    "JAVA解惑"的主题针对的是Java学习过程中遇到的一些常见问题和难点,旨在帮助开发者深入理解和解决这些问题。以下是基于这个主题和描述可能涵盖的一些关键知识点: 1. **Java基础**:这可能包括变量、数据类型、...

    Java解惑 中文版

    《Java解惑中文版》是一本专为Java程序员设计的指南,旨在帮助读者解决在编程过程中遇到的各种问题,提升程序的健壮性。本书深入浅出地探讨了Java语言的核心概念、常见疑惑以及最佳实践,旨在使开发者能够编写出更...

    Java PUZZLE Java 解惑

    Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑

    2010年-Java解惑(中文)

    《Java解惑(中文)》是一本专注于解决Java编程中常见问题和困惑的资源集合,旨在帮助初学者和有经验的开发者更好地理解和掌握Java语言。本文将深入探讨Java编程中的关键概念、常见问题以及解决方案。 1. **Java...

    Java解惑.pdf

    这份“Java解惑.pdf”文档很可能包含了解决Java开发者在编程过程中遇到的常见问题和困惑的详细解答。以下是可能涵盖的一些Java相关知识点: 1. **基础语法**:Java的基础语法包括变量、数据类型、运算符、流程控制...

    Java解惑 布洛克 著;陈昊鹏 译

    《Java解惑》 布洛克 著;陈昊鹏 译 扫描清晰带目录,仅供参阅,请支持正版

    java解惑 PDF版

    文档《java解惑 PDF版》中列举了95个这样的谜题,每个谜题都旨在帮助开发者理解并纠正一些常见的错误理解。以下是根据提供的部分内容解析的几个相关知识点。 ### 表达式谜题与取余操作符(%)的行为 在Java中,...

Global site tag (gtag.js) - Google Analytics