Java中String是final类为何能变更变量指向?解析与final变量的矛盾
为什么String是final类却能“改变”它的“值”?
嘿,这个问题其实是把两个完全不同的final概念搞混啦!咱们拆开来说就明白到底咋回事:
先搞懂String类的final到底管啥
- String被声明为
final class String,这里的final作用很明确:禁止这个类被继承。也就是说你永远写不出class MyString extends String这种代码,和String对象能不能被修改、变量能不能换指向完全没关系。 - 顺带提一句:String对象本身是不可变的——它内部存字符的数组是
private final的,而且没有对外提供修改这个数组的方法。一旦"hello"这个对象被创建,它的字符序列从生到死都是h-e-l-l-o,根本没法改。
为啥String A = "hello"; A = "World";能正常执行?
- 这里的A只是一个引用变量,它一开始指向内存里的
"hello"对象,后来的A = "World"根本不是修改原来的"hello"对象,而是让A这个变量重新指向了另一个全新的"World"对象。 - 打个接地气的比方:你手里攥着一张写着“hello小屋地址”的纸条(变量A),后来你把纸条换成了写着“World大厦地址”的新纸条——原来的hello小屋还好好待在原地,只是你不搭理它了而已。
那为啥final int a = 10; a =13;会报错?
- 当变量被加上
final修饰时,这个final的作用是禁止这个变量被重新赋值:- 对于int这种基本类型,变量a直接存的就是10这个数值,
final就禁止你把这个数值改成13; - 如果是引用类型的final变量,比如
final String B = "hello";,你也不能写B = "World",因为这是让B重新指向新对象,违反了final变量的规则,但你依然没法修改"hello"对象本身的内容(本来也改不了)。
- 对于int这种基本类型,变量a直接存的就是10这个数值,
最后划个重点
- String类的
final≠ String变量的final,完全是两码事! - String类的
final:锁死继承,配合内部设计保证String对象不可变; - final变量:锁死变量的指向/值,不让它换目标。
内容的提问来源于stack exchange,提问作者Pranjalgoyal13
相关产品推荐
相关产品推荐

