String屬於“假引用類型”,代碼為證(一個String引發的血案...)


一直以為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這樣的類嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM