0

.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"
  }

}
4

8 に答える 8

4

クラスまたはコンストラクターで宣言された場所でfinalフィールドを初期化する必要があります。

コンストラクターはオブジェクトの作成中に1回だけ呼び出されるため、コンストラクターではfinalフィールドの初期化が許可されます。

メソッドで初期化すると、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"
  }
}
于 2012-10-06T10:14:23.743 に答える
3

initializePaint()メソッドは、コンストラクターだけでなく、どこからでも呼び出すことができるためです。また、Javaコンパイラーは、コンストラクターでfinal変数が1回だけ割り当てられるようにしたいと考えています。したがって、割り当てをコンストラクターに移動する必要があります。

于 2012-10-06T10:13:08.853 に答える
1

変数は、そのfinal変数の減速時にのみ初期化されます。または、uはコンストラクターを介して初期化できます。

元:

class MyClass{
 private final int intVar;  
  private final Paint paint; 

  public MyClass(){
   intVar = 12; 
   paint= new Paint(); 
 }
}
于 2012-10-06T10:13:38.520 に答える
1

クラスの最終的なインスタンス変数は、コンストラクターのスコープでインスタンス化する必要があります。オブジェクトの初期化をコンストラクターに移動し、初期化メソッドでPaintゲッターを使用します。getPainter

最終変数を使用するためのところで+1。これは良いコーディングの練習です。IMO Java には、変数に対する「mutable」キーワードがあり、デフォルトとして final が必要です。

于 2012-10-06T10:09:46.217 に答える
1

あなたのコードでは、最終変数を初期化しませんでした。この変数は、BLANK FINAL 変数と呼ばれます。ここで、コンストラクターで初期化する必要があります。そうしないと、変数の値が null になるため、エラーが発生します。

于 2012-10-06T19:09:47.103 に答える
0

コンパイラは、コンストラクターでメソッドを呼び出すことを認識しますがinitializePaint()、このメソッドがpaint変数を設定することは認識しません。paint次のように、コンストラクターでフィールドを明示的に設定する必要があります。

class MyClass{
  private final int intVar;  //ok
  private final Paint paint; //error

  public MyClass(){
       intVar = 12; 
       paint= new Paint(); 
  }
}
于 2012-10-06T10:08:32.927 に答える
0

すべての最終変数の初期化は、コンストラクターからのメソッド呼び出しの呼び出し階層のどこかではなく、コンストラクターで行う必要があります(initializePaint()あなたの場合のように)。

于 2012-10-06T10:09:55.437 に答える
0

final一度割り当てられると、再割り当てできず、コンストラクターで割り当てる必要があることを意味します。したがって、メソッドを再割り当てすることはできませんpaint

編集: いくつかの読書: http://en.wikipedia.org/wiki/Final_(Java)

于 2012-10-06T10:09:55.607 に答える