问题代码
1 import java.util.*;
2
3 public class Rhymes {
4 private static Random rnd = new Random();
5
6 public static void main(String[] args) {
7 StringBuffer word = null;
8 switch(rnd.nextInt(3)) {
9 case 1: word = new StringBuffer('P');
10 break;
11 case 2: word = new StringBuffer('G');
12 break;
13 default: word = new StringBuffer('M');
14 break;
15 }
16 word.append('a');
17 word.append('i');
18 word.append('n');
19 System.out.println(word);
20 }
21 }
22
告诉你,都错了,它输出的只是 ain .
知道是什么问题么,提示一下,问题就是出来StringBuffer的构造函数上面。
下面就进入问题的分析部分:
不知道大家手边有没有Java的API帮助文档,查了一下,构造方法的说明如下:
/////////////////////////////////////////////////////////////////////////////////////////
StringBuffer
public StringBuffer()
-
构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer
public StringBuffer(int capacity)
-
构造一个不带字符,但具有指定初始容量的字符串缓冲区。
-
参数:
-
capacity- 初始容量。
抛出:
-
NegativeArraySizeException- 如果capacity参数小于0。
-
StringBuffer
public StringBuffer(String str)
-
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。该字符串的初始容量为
16加上字符串参数的长度。-
参数:
-
str- 缓冲区的初始内容。
抛出:
-
NullPointerException- 如果str为null
-
StringBuffer
public StringBuffer(CharSequence seq)
-
public java.lang.StringBuilder(
CharSequence seq) 构造一个字符串缓冲区,它包含与指定的
CharSequence相同的字符。该字符串缓冲区的初始容量为16加上CharSequence参数的长度。如果指定的
CharSequence的长度小于或等于 0,则返回容量为16的空缓冲区。-
参数:
-
seq- 要复制的序列。
抛出:
-
NullPointerException- 如果seq为null
从以下版本开始:
- 1.5
-
/////////////////////////////////////////////////////////////////////////////////////////
一共四个构造函数,但是没有一个参数是Char类型的,所以,我们的程序能够通过编译和运行,说明程序中构造函数的参数应该已经发生了转化了.这四个构造方法中可以满足的也就是public StringBuffer(int capacity)了,参数中的字符都已经被转化成了int类型,它做的实际工作就是分配该int类型的大小所对应的空白缓冲区.这样最后的结果是ain就好解释了.在空白缓冲中加入几个字符,那打印输出的时候自然也就是显示这几个字符了.
所以在使用StringBuffer构造方式的时候要注意一下,包括在使用其他API的时候也是,不要想当然,有困惑还是最好查一下API文档.
本文探讨了一个关于Java StringBuffer构造函数的常见误区,通过一个具体的代码示例揭示了如何不当的构造函数调用会导致预期外的结果。
1944

被折叠的 条评论
为什么被折叠?



