Java 我们可以说指向不可变对象的引用变量是常量变量吗?

Java 我们可以说指向不可变对象的引用变量是常量变量吗?,java,string,Java,String,我对以下问题有一个疑问: 以下代码创建了多少个字符串对象 String x = new String("xyz"); String y = "abc"; x = x + y; 在斯蒂芬的回答中,他提到x和y不是常数变量 我的怀疑字符串是最后一个类,它的实例将是一个常量,因为字符串是一个不可变的类为什么这个常量类的参考变量不是常量变量?-我同意Stephen的观点,尽管x=x+y指向堆内存中创建的“xyzabc”。有几个概念需要理解 将类标记为final不会使其不可变。它只是使它无法继承 JL

我对以下问题有一个疑问:

以下代码创建了多少个字符串对象

String x = new String("xyz");
String y = "abc";
x = x + y; 
在斯蒂芬的回答中,他提到x和y不是常数变量


我的怀疑字符串是最后一个类,它的实例将是一个常量,因为字符串是一个不可变的类为什么这个常量类的参考变量不是常量变量?-我同意Stephen的观点,尽管
x=x+y指向堆内存中创建的“xyzabc”。

有几个概念需要理解

将类标记为
final
不会使其不可变。它只是使它无法继承

JLS§8.1.1.2

如果一个类的定义是完整的,并且不需要或不需要子类,那么它可以被声明为final

如果最终类的名称出现在另一个类声明的extends子句(§8.1.4)中,则为编译时错误;这意味着最后一个类不能有任何子类

当类存储的值在初始化后无法更改时,称其为不可变

常量变量是一个标有
final
的变量

JLS§4.12.4

变量可以声明为final。最后一个变量只能指定一次。声明变量final可以作为有用的文档,它的值不会改变,并且可以帮助避免编程错误

如果将最终变量赋值给,则为编译时错误,除非在赋值之前明确未赋值(§16)

x
y
这里不是常量,因为它们没有标记为
final
。就这样

“但是字符串不能改变,所以它们是常量,对吗?”你可能会问

String
对象本身不能更改,但字符串变量可以更改。我将向您展示:

String s = "Hello";
s = "Goodbye";

变量的值已更改,以便它引用另一个字符串。原始字符串“Hello”没有更改。

因为不变性适用于实例而不是引用。您可以始终将引用点指向另一个不可变对象。如果你真的想阻止引用的重新分配,那么让它们
final
看看这个问题,这样可能会有帮助@最后谢谢你把它清理干净。因此,常量类和普通类创建的引用变量之间没有区别?@Pranav-没有所谓的常量类。我们只有可以创建的不可变实例和引用constant@TheLostMind我指的是用
final
关键字定义的类。该类将变得不可变。所以,如果我用那个不可变的类名声明一个变量,就不会发生什么特别的事情。这与声明一个数据类型为普通类名的变量相同。