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