Java 不可变字符串和final关键字

Java 不可变字符串和final关键字,java,string,Java,String,我通常将全局编译时变量(如我使用的常量,如阿伏伽德罗数或其他)放入公共静态最终变量中。然而,我从未考虑过这是否真的对字符串有任何作用。既然字符串已经是不可变的,那么把它设为final有什么意义呢 这是一个理论问题,而不是一个实践问题。final不同于不变的final表示处理程序(变量)不能指向另一个对象。不可变意味着对象不能更改其内部状态 static final Foo Foo Foo=new Foo(1)表示以后不能使用Foo=new Foo(2) 如果Foo是不可变的,这意味着一旦创建了

我通常将全局编译时变量(如我使用的常量,如阿伏伽德罗数或其他)放入公共静态最终变量中。然而,我从未考虑过这是否真的对字符串有任何作用。既然字符串已经是不可变的,那么把它设为final有什么意义呢


这是一个理论问题,而不是一个实践问题。

final
不同于不变的
final
表示处理程序(变量)不能指向另一个对象。不可变意味着对象不能更改其内部状态

  • static final Foo Foo Foo=new Foo(1)
    表示以后不能使用
    Foo=new Foo(2)
  • 如果
    Foo
    是不可变的,这意味着一旦创建了它,就不能更改它的字段。例如,你不能有
    Foo-Foo=new-Foo(1);foo.setValue(3)

最终版
仅适用于参考文件。如果声明一个对象final,并不意味着该对象不能更改,它不允许更改对该对象的引用。它与不可变不是一回事。

您将字符串的引用与实际字符串混淆了。Immutable描述实际的字符串对象,意味着您不能更改该对象的值。Final指的是对字符串对象的引用,表示您不能更改该引用指向的字符串。 考虑下面的代码: 公共静态字符串str=“happy”; ... str=“sad”

这段代码创建了两个字符串对象,一个包含值“happy”,另一个包含值“sad”。这两个对象都不能更改(因为字符串是不可变的)。str是一个引用,可以指向这些对象中的任何一个;然而,我们是否要将第一行代码更改为:publicstaticfinalstring str=“happy”;str=“sad”将不再合法。因为我们已经将str更改为最终变量,所以不能让它指向不同的对象