[英]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節)。
x
和y
此處不是常量,因為它們未標記為final
。 就是這樣 。
“但是字符串不能改變,所以它們是常量,對嗎?” 你可能會問。
String
對象本身不能更改,但字符串變量可以更改。 我會給你看:
String s = "Hello";
s = "Goodbye";
更改變量的值,使其引用另一個字符串。 原始字符串“ Hello”未更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.