[英]The final data member gives different value (non-static data member)
好吧,最終概念說,如果不首先聲明它,那么它將在調用它的函數中產生錯誤,並且最終數據成員也可以從構造函數中得到補充,這被稱為空白最終概念。
但是最終的數據成員一旦分配就無法更改,但是這里
public class Demo
{
final int w;
public Demo()
{
fun();
w=10;
}
public void fun()
{
System.out.println(w);
}
public static void main(String ... args)
{
Demo d=new Demo();
System.out.println(d.w);
}
}
這里在fun()中w的值是0 ..然后我將w賦值為10,這樣在主println中它現在是10。
所以我的問題在fun()中,w將值顯示為0表示它在堆中有一個空間作為對象,並且它的值是0,我已經用final關鍵字鎖定了它,因此它不應進一步更改,所以為什么w = 10 in如果我們已經可以在fun()中看到w的值已經確定了,那么構造函數就不會給出任何錯誤...並且如果w的值可以在構造函數中變化,為什么當我在w = 10之后確定w = 20時顯示出錯誤在構造函數中。
並且如果最終變量可以使用默認值,那么為什么需要顯式分配它們。
“編譯器實際上所做的是內部生成一個單一的類初始化例程,該例程將所有靜態變量初始化器和所有靜態初始化器代碼塊按它們在類聲明中出現的順序組合在一起。該單個初始化過程將自動運行,僅在第一次加載類時一次。”
“現在我們已經證明靜態最終字段確實獲得了默認值,您可能想知道為什么默認值不夠用。除了顯而易見的問題之外,該問題沒有好的答案:“規范如此說明。”摘自8.3.1.2:
如果聲明該類的靜態初始值設定項(§8.7)未明確分配空白的final(§4.12.4)類變量(第16.8節),則是編譯時錯誤。
我們只能猜測這種限制背后的動機,但是我認為這是為了使程序更易於理解。 如果要將變量設置為0,則更明確地進行設置。”
final int w;
您尚未初始化它。
如果你有
final int w=5;
然后它將顯示此compilatino錯誤
The final field Demo.w cannot be assigned
一旦定義了最終值,就無法再次分配它。
所有字段均初始化為默認值。 在您的情況下,最初將w
設置為0
。 這就是為什么System.out.println()
打印0
的原因。
您必須在構造函數的末尾為所有final字段分配一個值。 僅從這一刻起,它的價值就不應再改變了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.