String属于“假引用类型”,代码为证(一个String引发的血案...)

一直以为String是引用类型,今天写了个浅拷贝的测试,发现String有基本类型的特征。

 class A{
public int a = 555;
}
class User implements Cloneable{
public String str = "aaa";//这个属于假引用类型
public int a = 111;
public A cls =new A(); public void print(){
System.out.println(str+a+cls.a);
} @Override
protected Object clone() {
// TODO Auto-generated method stub
try {
return super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
} public class TestClone { public static void main(String args[]){
User u = new User(); User uclone = (User) u.clone();
uclone.str = "bbb";
uclone.a = 222;
uclone.cls.a = 666; u.print();
uclone.print();
} }

print结果:

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

上一篇:HTML5本地存储localStorage与sessionStorage详解


下一篇:vector、list、deque三者比较