今天看了一下面试的宝典,其中又涉及到了String不可变类,一阵头大,什么是不可变类,怎么就不可变了呢?下面我简单的介绍一下:
什么是不可变类
不可变类就是创建一个对象,不能改变对象的成员变量,简单的说这个就是不可变量。
区分对象和对象的引用
String aa = "12";
aa = "34";
System.out.println(aa);
//输出34
不是说不可变吗,怎么还输出34了呢,其中这里“12”是存在内存里的对象,而aa只是一个对象的引用,而后来又把这个引用指向了34这个在内存里的对象,所以输出的是34而不是12,大家都知道Java是面向对象的,不能直接操作做内存,而C++可以操作。引用和对象的关系是下面这样的:
String为什么是不可变类呢?
String类是final的,其成员变量是private的,而且发现里面是 没有public的setter和getter的。
String类里的方法s.subString()、s.replace()等是可变的?是为什么?
String aa = "ABCD";
String result = aa.replace("A","a");
//输出result为aBCD,怎么变了呢
可以看一下String类的源码
返回的新的String,那就没问题了。
String真的不能变吗?其实可以通过反射改变String内的属性的值,就不说了,一般不会用到。