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这样的类吗?

原文地址:https://www.cnblogs.com/cmgrass/p/3392116.html