document.write('
B
[解析] 不可变类(Immutable Class)是指当创建了这个类的实例后,就不允许修改它的值的类,也就是说,一个对象一旦被创建出来,在其整个生命周期
中,它的成员变量就不能被修改了。它有点类似于常量(Const),即只允许其他程序进行读操作,而不允许其他程序进行修改操作。
 在Java类库中,所有基本类型的包装类都是不可变类,例如Integer、Float等。此外,String也是不可变类。可能有人会有疑问,既然String是不可变
类,为什么还可以写出如下代码来修改String类型的值呢?
public class Test
{
public static void main(String[] args)
{
String s="Hello";
s+="world";
System.out.println(s);
}
}
程序的运行结果为:
Hello world
 表面上看,s+="world"的作用好像是修改String类型对象s的值,其实不是,String s="Hello"语句声明了一个可以指向String类型对象的引用,这个引
用的名字为s,它指向了一个字符串常量“Hello”。s+="world"并没有改变s所指向的字符串的值(由于“Hello”是String类型的对象,而String又是不可
变量),在这行代码运行后,s指向了另外一个String类型的对象,该对象的内容为“Hello world”。原来的那个字符串常量“Hello”还存在于内存中,并
没有被改变。
 在Java语言中,除了8种原始的数据类型(分别为byte、short、int、long、float、double、char、boolean)外,其他的类型都是对象,在方法调用的时
候,传递的都是引用。从本质上来讲,引用也是按值传递,只不过传递的这个值是对象的引用而己,因此,在方法调用的时候,对形参引用所指对象属性值
的修改对实参可见。但是,对引用值本身的修改对实参是不可见的。
 回到本题中来,在调用change方法的时候,change方法的形参str实际上是实参str(main方法中的str)的一个副本,由于String是不可变量,因此,无法
通过str来修改这个字符串的内容,执行语句str="test ok"的结果是使形参的str指向了另外一个常量字符串(可以理解为修改了形参的值,而不是修改了形参
所指向对象的值),但是这个修改对实参是不可见的,调用change方法结束后对象的main方法中str的值还是“good”。而change方法的形参ch也是实参
ch (main方法中的ch值)的一个副本,但是在这个方法中通过形参ch修改了实参ch所指向对象的值,即数组元素的值,形参ch与实参ch指向的是同一个对
象,因此,通过形参对这个对象值的修改对实参是可见的,所以,当调用ex.change方法后,main方法中ch指向的数组的值变为{\'g\',\'b\',\'c\'},因为该方法只
是改变了ch[0]的值而已,所以,程序最终输出为字符串“good and gbc”。所以,选项B正确。
 

 

');