You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"对象本身的内容(本来也改不了)。

最后划个重点

  • String类的final ≠ String变量的final,完全是两码事!
  • String类的final:锁死继承,配合内部设计保证String对象不可变;
  • final变量:锁死变量的指向/值,不让它换目标。

内容的提问来源于stack exchange,提问作者Pranjalgoyal13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:22:50