我对stackoverflow中answers之一的疑问有疑问:
以下代码创建了多少个String对象?
String x = new String("xyz");
String y = "abc";
x = x + y;
在斯蒂芬的回答中,他提到x和y不是常数变量。
我怀疑 - 字符串是一个最终类,它的实例将是一个常量,因为String是一个不可变类。 为什么这个常量类的引用变量不是一个常量变量? - 我确实同意Stephen,尽管x = x + y;
指向" xyzabc"在堆内存中创建。
答案 0 :(得分:0)
您需要了解一些概念。
将类标记为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”未更改。