繁体   English   中英

我们可以说指向不变对象的参考变量是常量吗?

[英]Can we say that the reference variable pointing to an immutable object is a constant variable?

我有一个疑问从一个答案在计算器到以下问题:

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

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

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

我的疑问-字符串是一个最终类,并且它的实例将是一个常量,因为字符串是一个不可变的类。 为什么此常量类的引用变量不是常量变量? -我确实同意斯蒂芬的观点,因为x = x + y; 指向在堆内存中创建的“ xyzabc”。

您需要了解一些概念。

将一个类标记为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”未更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM