[英]Java and final initialization
我正在從.NET“轉換”為Java。 我想知道為什么下面的代碼不起作用
class MyClass{
private final int intVar; //ok
private final Paint paint; //error "Variable paint might not have been initialized"
public MyClass(){
intVar = 12;
initializePaint();
}
private void initializePaint(){
paint = new Paint(); //error "cannot assign a variable to final variable"
}
}
您應該在類或構造函數中聲明的地方初始化final字段。
構造函數中允許對最終字段進行初始化,因為在創建對象時,構造函數僅被調用一次。
當您在方法initializePaint()
對其進行initializePaint()
,您會得到編譯器錯誤,因為此方法可以多次調用,並且最終變量/字段是常量,不能更改。 正如您將多次調用initializePaint()
方法一樣,對final字段進行多次初始化是錯誤的。 因此,編譯器將為此提供錯誤。
class MyClass{
private final int intVar; //ok
private final Paint paint;// paint = new Paint(); to avoid //error "Variable paint might not have been initialized"
public MyClass(){
intVar = 12;
//initializePaint();
paint = new Paint(); // here initialized And allowed.
}
private void initializePaint(){
paint = new Paint(); //error "cannot assign a variable to final variable"
}
}
因為initializePaint()方法可以在任何地方調用,而不僅僅是構造函數。 Java編譯器希望確保最終變量在構造函數中僅分配一次。 因此,您必須將分配移至構造函數。
類的最終實例變量必須在構造函數的范圍內實例化。 將Paint
對象的初始化移至構造函數,並在初始化方法中使用getter getPainter
。
BTW +1用於使用最終變量。 這是一個很好的編碼實踐。 IMO Java應該對變量使用'mutable'關鍵字,並將final作為默認值。
final
變量僅在減速時才初始化,也可以通過構造函數對其進行初始化。
例如:
class MyClass{
private final int intVar;
private final Paint paint;
public MyClass(){
intVar = 12;
paint= new Paint();
}
}
在您的代碼中,您沒有初始化最終變量。 此變量稱為BLANK FINAL變量。 現在,您必須在構造函數中對其進行初始化。 否則,您會收到錯誤消息,因為變量的值將為null。
編譯器看到您在構造函數上調用了initializePaint()
方法,但是看不到此方法將設置paint
變量。 您需要在構造函數中明確設置paint
字段,例如:
class MyClass{
private final int intVar; //ok
private final Paint paint; //error
public MyClass(){
intVar = 12;
paint= new Paint();
}
}
所有最終變量的初始化必須在構造函數中進行,而不是在構造函數的方法調用的調用層次結構中的任何地方進行(例如您的情況下的initializePaint()
)。
final
方法一旦分配,就無法重新分配,而需要在構造函數中進行分配。 所以你沒有辦法重新分配paint
編輯:一些閱讀: http : //en.wikipedia.org/wiki/Final_(Java)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.