IT Notes‎ > ‎Java‎ > ‎Java Language‎ > ‎《Java 解惑》笔记‎ > ‎

Puzzle 23: No Pain, No Gain

下面的代码输出什么?
        StringBuffer word = new StringBuffer('H');
        word.append("ello");
        System.out.println(word);
无论执行多少次,都得不到 "Hello",只得到"ello",这是怎么回事呢?改成下面的就好了:
        StringBuffer word = new StringBuffer("H");
        word.append("ello");
        System.out.println(word);
注意上面黑体标识的代码,头一个用的是单引号,后一个用的是双引号。这种写法上的差异,导致了参数类新是不一样的,从而调用了 StringBuffer 不同的构造方法。查 API 文档:
http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html
public StringBuffer(int capacity)
Constructs a string buffer with no characters in it and the specified initial capacity.
Parameters:
capacity - the initial capacity.
Throws:
NegativeArraySizeException - if the capacity argument is less than 0.
public StringBuffer(String str)
Constructs a string buffer initialized to the contents of the specified string. The initial capacity of the string buffer is 16 plus the length of the string argument.
Parameters:
str - the initial contents of the buffer.
Throws:
NullPointerException - if str is null
这下就明了了,第一段代码中new StringBuffer('H')的 'H' 是 char 类型,被 cast 成 int 后调用构造器 StringBuffer(int capacity) 。第二段代码调用构造器StringBuffer(String str) 。所以出现了本文开头的现象。

值得注意的是,StringBuidler 也有类型的情况。

原书中,还夹带说了 switch 语句块中遗漏 break 的后果,具体代码参:
Comments