String 是一个类,很特殊,并且是一个final类型的类:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc { ... }
对于方法来讲,String不可被继承,同样作为类,String可以直接赋值,当然也可以通过new的方式来创建一个String字符串。这也造就了String是不可被修改的,即使通过其它方法拼接,那也是重新在常量池中新建字符串赋值,而不会修改原有的String值。
来讲讲这个案例:
public class StringTest {
public static void main(String[] args) {
String str = new String("Good");
char[] ch = {'t', 'e', 's', 't'};
test_3 t = new test_3();
t.change(str, ch);
System.out.println(str); //good
System.out.println(ch); //best
}
public void change(String s, char[] c) {
s = "Good Ok";
c[0] = 'b';
}
}
声明了一个change方法,给形参s赋值为"Good OK",给形参c的首个字母修改为字符’b’。
然后在main方法中创建一个String字符串和一个char型数组。然后将str、ch作为引用变量类型作为形参传递给change,change再执行相应的命令。
那么结果呢?str的值还是Good,ch的值已经变为了best。
我们知道,引用类型作为形参实际上传递的是地址值,因此change()内修改的str实际上只是change形参的str,而不是main方法里的str,也正是因为String是不可变的,所以change只修改了它形参的String值,而无法改变main方法的String值。char型数组因为没有final限制,所以可以随意修改,通过赋地址值给change,完成首字母的改写。