先放一段String类的源码
通过源码可以发现,String类有一个命名为value的char数组的成员变量,并且是final修饰的。
如果被final修饰的成员变量是基本类型,那么这个成员变量一旦被赋值就不能再改变。但数组并不是基本类型,而是引用类型,所以value即使被final修饰,它里面的元素依然是可以改变的。
之所以说String类是不可变的,是因为String类没有对外提供修改value属性的方法(如setter方法),我们无法在外部去改变value的内容。
那String类是觉得不可变的吗?也不是,其实可以通过反射去修改String类对象的值。代码如下:
执行结果: