字符串类型是比较特殊的一个类,它的内容保存在一个叫字符串缓冲区的内存空间,字符串变量保存着它的内容的地址,当你给字符串变量赋予新值时,它保存新值所在的地址,也就是说,修改字符串变量实际上没有修改字符串本身,而是新建了一个字符串,然后,原来的变量保存了新字符串的地址,当然,也不一定是新建,因为系统先是去字符串缓冲区查找有没有你要的新字符串,如果有,直接修改字符串变量中保存的地址。
具体到你的问题,当你初始化wordBean时,kanaStr保存了“1”的地址,同理,wordBeanArr的第一个项目也是保存着“1”的地址,当你给wordBean.kanaStr赋新值时,系统先去字符串缓冲区找有没有“孙”,有,将它的地址写入kanaStr,没有,新建一个字符串“孙”,然后将其地址写入kanaStr。从这个过程我们可以发现,wordBeanArr的第一个项目仍然保存着“1”的地址,所以,你输出时,不会输出“孙悟空”。

解决方案 »

  1.   

    我觉得不是这个问题,
    你可以试试, 用普通的类型,甚至用基本数据类型,也是这样.
    我发现 java5,6,7都是一样结果.
    不是字符串的原因.
      

  2.   

    还有, 用Integer的时候,开始以为是 IntegerCache的原因, 后来将数字该成很大,也是一样.
    静态初始化和动态初始化数组都一样.好奇怪
      

  3.   

    int[] wordBeanArr={kanaStr,kannjiStr,Chinese};理解了这句代码,这个问题就解决了。下面啰嗦一下,在new WordBean()后会进行对象实例化,依次执行String kanaStr="1"; String kannjiStr="2";String Chinese = "3";然后到int[] wordBeanArr={kanaStr,kannjiStr,Chinese}时,其内存空间中存储的是"1"、"2"、 "3"的地址,后面的改变比如wordBean.kanaStr="孙";只改变了kanaStr的指向,但是并没有对wordBeanArr重新赋值,所以仍然是对象初始化时的值。