簡體   English   中英

Java和最終初始化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM