我们都知道在java中String是不可变的
那么什么叫不可变?
百度百科给出:
在面向对象及函数编程y语言中,不可变对象是一种对象,在被创造之后,它的状态就不可以被改变。
我们可理解为:
一个对象创建完成之后,它的状态就不能再改变,包括的对象里面的成员变量,基本数据类型的值都不能改变,这样就叫做不可变对象
理解定义不叫简单,但是实际情况下我们总会混淆引用与对象,进而以为String可变,比如下面代码:
String s = "abc";
System.out.println(s);
s = "123";
System.out.println(s);
输出:
那么是String类型的s发生变化了才将abc改变成了123吗?
显然不是的,s只是一个引用,真正的对象是后面的abc和123,所以在内存中的关系这样的
abc对象并没有改变,而是将引用重新指向了一个新的对象123.
我们再从源码的角度看
我们点进String类,可以看到String类是被final修饰的。
final关键字的作用:
inal关键字修饰类, 修饰字段, 修饰方法,修饰局部变量,修饰方法的形参
final修饰类,表示最终类, 不能被继承,不能作为父类存在
final修饰字段,在定义时必须显示初始化, 不能被修改, 一般与static同时使用,所有字母都大写,称为final常量
final修饰方法,不能被覆盖(重写)
final修饰局部变量, 一旦初始化就不能再修改, 注意final修饰引用类型变量,是指这个变量不能再指向 其他对象 , 可以修改它的字段值
final修饰方法形参, 在方法体中不能修改final参数的值
我们看到第二条final修饰了类就不能被继承,就是最终类了,它的方法不能被继承重写
String类型的其实使用char类型的数组存放的,而这个数组也被final关键字修饰了
在整个String类中并没有一个用来修改对象值的方法
综上我们说java 中的String是不可变的