1

これが機能しないことは承知していますが、これは単なる例であるため、機能しない理由を理解できます。

public class MyClass {

    final static JButton b;

 public void myMethod() {
   b = new JButton("Hello!");
 }
 }

final static JButton b;1)回線にエラーがあるのはなぜですか?staticまた、キーワードを削除するとこのエラーが消えるのはなぜですか?

2)staticキーワードの有無にかかわらず、b = new JButton("Hello!"); これがなぜであるのか疑問に思っている行にエラーがありますか?メソッド内でfinal変数をインスタンス化しても問題ないと思いました。

4

5 に答える 5

7

静的フィールドを と宣言する場合finalは、静的初期化ブロックまたは初期化式を使用して、静的に初期化する必要があります。コンストラクターで初期化することはできません。

非静的フィールドを と宣言するときはfinal、すべてのコンストラクターで初期化するか、初期化式を使用するか、インスタンス初期化ブロックで初期化する必要があります。

于 2012-05-08T21:14:42.513 に答える
1

一部の人々は、静的で最終的なものが本当に何であるかを読み直す必要があります。

静的変数は、そのクラスのすべてのインスタンスに対してグローバルです。「intstaticage= 0」を含むクラスPersonがあり、age++と言う場合。コンストラクターでは、ageはすべてのインスタンスで同じ値になります!つまり、すべてのPersonインスタンスで、3xの新しいPerson()は年齢が3であると想定しています。michael.age==3およびsusan.age==3およびtom.age==3

そのため、その変数用にいくらかのスペースを予約し、初期化して宣言する必要があります。これは、「クラスのすべてのインスタンスに対して1つの変数がある」ことを意味するためです...

次に、最後の変数はその宣言に関するデータで埋める必要があります。後でその変数を編集してください!const(定数)のように

したがって、最後の静的ファイナルがあります。ご存知かもしれませんが、この変数はクラスのすべてのインスタンス用であり、宣言時に初期化され、全体的に変更することはできません。これは、Javaのクラス包括的な「const」(定数)変数を説明しています。

どうぞ!

于 2012-05-08T21:25:56.123 に答える
1

割り当てありは、finalすぐに、またはコンストラクターでのみ許可されます。したがって、以下のみが許可されます。

class A {
    static final B b = new B();
    static final C c;
    static { // Static initializer block.
         c = new C();
    }
    final B b2 = new B();
    final C c2;
    { // Initializer block.
         c2 = new C();
    }
    final D d2;
    A() {
        d2 = new D();
    }
}
于 2012-05-08T21:18:33.100 に答える
1

フィールドはstatic finalクラス自体で初期化する必要があるため、コンパイラはデフォルト以外の値を指定するように要求しています。デフォルトの初期化子を提供するか、初期化ブロックで値を提供できます。

また

public class MyClass {
  final static JButton b = new JButton("Hello!");
}

また

public class MyClass {
  final static JButton b;

  static{
      b = new JButton("Hello!");
  }
}

有効です。

そのyourMethod時点でクラスはすでに初期化されていることが予想され、問題のフィールドも同様に初期化されていることが予想されるため、 が呼び出されるまでにはすでに手遅れです。

于 2012-05-08T21:19:56.850 に答える
0

static final 変数は、直接 (変数の近くで) または static ブロックを使用して初期化する必要があります。

final 変数 (非静的) は、直接 (変数の近くで) 宣言するか、初期化ブロックを使用して宣言するか、オブジェクト コンストラクターで宣言する必要があります。

于 2012-05-08T21:15:48.867 に答える