一直以為String是引用類型,今天寫了個淺拷貝的測試,發現String有基本類型的特征。
1 class A{ 2 public int a = 555; 3 } 4 class User implements Cloneable{ 5 public String str = "aaa";//這個屬於假引用類型 6 public int a = 111; 7 public A cls =new A(); 8 9 public void print(){ 10 System.out.println(str+a+cls.a); 11 } 12 13 @Override 14 protected Object clone() { 15 // TODO Auto-generated method stub 16 try { 17 return super.clone(); 18 } catch (CloneNotSupportedException e) { 19 // TODO Auto-generated catch block 20 e.printStackTrace(); 21 } 22 return null; 23 } 24 } 25 26 public class TestClone { 27 28 public static void main(String args[]){ 29 User u = new User(); 30 31 User uclone = (User) u.clone(); 32 uclone.str = "bbb"; 33 uclone.a = 222; 34 uclone.cls.a = 666; 35 36 37 u.print(); 38 uclone.print(); 39 } 40 41 }
print結果:
1 aaa111666 2 bbb222666
如果String是引用類型,那么對象u打印的結果就應該是aaa222666.而實際上str的內容並未因為uclone的修改而修改,說明他們指向的是不同的地址,那么str具有基本類型(8種:int long char float byte double boolean short)的特征。可是按照說法,它是一個類,應該是引用類,可為什么具有基本類型的特征呢?在這里求教java同仁,小菜求解。(開始我以我String是實現Cloneable接口的,從而修改它不會引起其他對象的變化,但String確實是沒有實現Cloneable,這我就不解了。)
ps:雖然不懂為什么,但一定會figure it out的。但在記憶的時候,要記住String是引用類型的特例。
最后問下:是什么原因造成了String的這種特殊性?或者說我們自己可以自定義一個像String這樣的類嗎?