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

时间:2017-06-22 05:05:22

标签: java string

我对stackoverflow中answers之一的疑问有疑问:

以下代码创建了多少个String对象?

String x = new String("xyz");
String y = "abc";
x = x + y; 

在斯蒂芬的回答中,他提到x和y不是常数变量。

我怀疑 - 字符串是一个最终类,它的实例将是一个常量,因为String是一个不可变类。 为什么这个常量类的引用变量不是一个常量变量? - 我确实同意Stephen,尽管x = x + y;指向" xyzabc"在堆内存中创建。

1 个答案:

答案 0 :(得分:0)

您需要了解一些概念。

将类标记为final并不会使其成为不可变的。它只是使它不可继承。

  

JLS§8.1.1.2

     

如果一个类的定义完整且不需要或不需要子类,则可以将其声明为final。

     

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

当一个类在初始化后无法更改它所存储的值时,它被认为是不可变的。

常量变量是标有final的变量。

  

JLS§4.12.4

     

变量可以声明为final。最终变量只能分配一次。声明变量final可以作为有用的文档,它的值不会改变,可以帮助避免编程错误。

     

如果分配了最终变量,那么这是一个编译时错误,除非在分配之前它是明确未分配的(§16)。

xy此处不是常量,因为它们未标记为final就是这样

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

String个对象本身无法更改,但字符串变量可以。我会告诉你:

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

变量的值被更改,以便引用另一个字符串。原始字符串“Hello”未更改。