2016-02-26 600 views
-1

我有兩個final在類級別聲明的變量,但它們沒有被初始化。
因此,現在當我嘗試爲該類創建默認構造函數時,它給出了一個錯誤,說
The blank final field may not have been initialized最終變量初始化

爲什麼會發生此錯誤?爲什麼需要在構造函數中初始化最終變量?

我還有另一個查詢,也就是說,不可能創建一個沒有默認構造函數的實例嗎?即使我們有參數化的構造函數?

+3

參考http://stackoverflow.com/questions/26935453/the-blank-final-field-initial-may-not-have-been-initialized – sasikumar

+0

您必須始終用構造函數初始化最終字段。最終字段必須在對象實時期間分配。無論構造函數 - 每個最終字段都必須賦值。 – mlewandowski

+0

@mlewandowski你不必使用構造函數來完成它 - 你可以直接爲字段賦值或使用初始化塊(基本上是相同的)。 –

回答

0

Final variable是那些變量which can not be changed once object is initialized.所以任何你將不得不初始化最終變量。如果您提供默認構造函數以及參數化consructor,則必須初始化這些變量,因爲您以後不能更改該值。

1

爲什麼需要在構造函數中初始化最終變量?

A final字段必須在構造函數中初始化,因爲這是final已定義的意思。

如果你調用一個構造函數,你不必在默認的構造函數中設置final域。

class A { 
    final int a; 

    public A() { 
     this(0); 
    } 

    public A(int a) { 
     this.a = a; 
    } 
} 

是不可能沒有默認構造函數創建一個實例?

是的。有很多方法可以做到這一點,通常是通過調用一個帶參數的構造函數。

即使我們有參數化構造函數?

在這種情況下,您將只有一個構造函數,如果您定義一個構造函數,它將不帶任何參數。