11

最終変数に値が割り当てられると、変更できないことを知っています。ただし、これに関していくつか質問があります。

  • static final JButton button;クラスの外側にフィールドがある場合、mainメソッドで値を割り当てようとするとbutton = new JButton("OK");、最終修飾子を削除するようにというエラーが表示されますか? ただし、元のbutton変数はまだオブジェクトを参照していないため、一度割り当てることができるという印象を受けましたか?

  • 第 2 に、への参照を完全に削除してbuttonstatic final JButton button;クラスの外にある場合、IDE は「空白の最終フィールド ボタンが初期化されていない可能性があります」と主張します。これは、すべての最終フィールドを初期化する必要があるということですか? もしそうなら、後で初期化できないように見えるので、そこで初期化する必要があります。

  • また、ばかげた質問ですが、最終的な変数がインスタンスまたはデータ型を参照する場合、それを他のものに割り当てることはできないという私の最初の仮定は正しいですか?

このコードは完全ではありませんが、私の要点を説明するために提供されています。

public class FinalVarTester {

    static final JButton button;

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        container.setLayout(new BorderLayout());
        button = new JButton("OK");
        container.add(button, BorderLayout.SOUTH);
    }

}
4

7 に答える 7

18

static final 変数は、静的初期化子で、または直接初期化する必要があります。だからどちらか

static final JButton button = new JButton();

また

static final JButton button;

static {
  button = new JButton();
}

Java 言語仕様には、それに関するドキュメントがいくつかあります。最終変数に関するセクションでは、コンパイル エラーが発生する理由を説明しています。

割り当ての直前に割り当てが確実に解除されていない限り (§16)、final 変数が割り当てられると、コンパイル時エラーになります。

そして第16章は明確な割り当てについて話します

于 2012-04-21T14:04:18.880 に答える
3

finalフィールドは、プログラムの残りの部分の値になるため、実際に初期化する必要があります。

その例外は、final変数がコンストラクターで初期化される可能性があることです。静的フィールドはインスタンスに属さないため、初期化する必要があります (コンストラクターはありません) 直接初期化するか、静的初期化ブロックを使用してそれを行うオプションがあります。

あなたの最後の質問に関しては、はい、これが最終と呼ばれる理由です。

于 2012-04-21T14:03:34.917 に答える
0

正しい答えは、static final変数は常にクラスの初期化時に初期化されるということです。つまり、指定した値またはデフォルト値 (null、0、false) のいずれかに初期化されます。

于 2012-04-21T14:32:50.660 に答える
0

クラス スコープ内の最終変数は、宣言内またはコンストラクター内で初期化する必要があります。main 関数で宣言されていない限り、main 関数の final 変数に割り当てることはできません。最終フィールドはすべて初期化する必要があります。すべての変数は、使用する前に初期化する必要があります。

于 2012-04-21T14:02:46.587 に答える
0

問題は、クラス内のメソッドで最終変数を初期化することです(メインメソッドもメソッドです:))。Java では "final" は定数のようなもので、一度だけ初期化できます。集計ではなく合成で行います。

public class FinalVarTester {

    static final JButton button = new JButton("OK");

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        container.setLayout(new BorderLayout());
        container.add(button, BorderLayout.SOUTH);
    }
}
于 2012-04-21T14:13:29.513 に答える