web-dev-qa-db-ja.com

Java-最終的な変数

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

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

  • 次に、buttonへの参照を完全に削除して、クラスの外に_static final JButton button;_がある場合、私のIDEは「空白の最終フィールドボタンがこれは、すべての最終フィールドmustが初期化されることを意味しますか?そうであれば、それらをそこで初期化する必要があります後で初期化できないようです。

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

このコードは完全ではありませんが、私のポイントを説明するために提供されています:

_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);
    }

}
_
11
Tim

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

static final JButton button = new JButton();

または

static final JButton button;

static {
  button = new JButton();
}

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

割り当ての直前に明確に割り当てられていない(§16)場合を除いて、最終変数が割り当てられていると、コンパイル時エラーになります。

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

18
Robin

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

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

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

3
MByD

より良いニースの方法:

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

最終変数は、初期化子または割り当てステートメントのいずれかを介して、一度しか初期化できません。宣言時に初期化する必要はありません。これは「空白の最終」変数と呼ばれます。

最終変数のタイプ

1)インスタンスの最終変数:

クラスの空の最終インスタンス変数は、それが宣言されているクラスのすべてのコンストラクターの最後に確実に割り当てる必要があります。そうでない場合、コンパイル時エラーが発生します

2)静的最終変数

空白の最終静的変数は、それが宣言されているクラスの静的初期化子で確実に割り当てられる必要があります。そうでない場合、コンパイル時エラーが発生します

どちらの場合も、初期化前に最終変数を使用しないようにすることが目的です。

したがって、あなたのケースでは、クラスがロードされるときに初期化する静的初期化ブロックを介して初期化する必要があります。

参照: http://en.wikipedia.org/wiki/Final_(Java)

0
Arun

正解は、static final var is alwaysクラスの初期化時に初期化-指定した値またはデフォルト値(null、0、false)に初期化されます。

0
Marko Topolnik

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

0
Decade Moon

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

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);
    }
}
0
Zhivko Draganov