String不可變的是參考這裏。
http://www.2cto.com/kf/201401/272974.html
String 不可變得一個重要緣由是由於String被聲明成了final類,可是觀察Stringbuffer也被聲明成了final類。因此,String 不可變得緣由不是由於其在聲明的時候聲明生了final,而是在各類方法的內部都是return了一個新的對象,因此String是不可修改的。
final關鍵字在聲明一個對象時有兩種用法,第一種,在使用這個類的時候聲明,就像這樣:html
javapublic class Day01 { private static final List Loans = new ArrayList(); public static void main(String[] args) { Loans.add("xxx"); Loans = new Vector(); //不合法 } }
能夠向對象加數據。可是不能使他的引用指向另一個對象。
第二種,在定義這個類的時候使用final關鍵字:
好比這種:java
javapublic final class String{ }
他僅僅表示不能被繼承。可是他的引用依然可以指向其餘的對象:ide
javaString a="ccc"; a="bbbb";
一個例子:this
javapublic final class HelloWorld { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "HelloWorld [name=" + name + ", age=" + age + "]"; } } public class Day01 { private static final List Loans = new ArrayList(); public static void main(String[] args) { HelloWorld a=new HelloWorld(); a.setName("x"); a=new HelloWorld(); a.setName("y"); } }
在定義類的時候聲明這個類是final的,可是它的引用依然能夠指向別的對象。所以,定義類使用final關鍵字與在類中間聲明一個是對象成員變量是final的做用是不同。code