37

座席の配列があり、配列には2つの文字列(選択されたものと空)があります。マウスをクリックすると、配列をトラバースして、選択した座席を見つけたいと思います。ボタンを押すと、次のように表示されます。

最終的なローカル変数 seatno は、外側の型で定義されているため、割り当てることができません。

    JButton btnContinue = new JButton("Next");
    btnContinue.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent arg0) {

            for(int x=0;x<17;x++){
                if(anArray[x]=="selected"){

                    seatno = anArray[x];
                }
            }

            data page=new data(newfrom,newto,newtime,date2,seatno);
            page.setVisible(true);
            setVisible(false);
        }
    });
    btnContinue.setBounds(358, 227, 62, 23);
    contentPane.add(btnContinue);
4

6 に答える 6

96

要点は、囲んでいる型のメソッド ローカル変数が実際に匿名クラスのインスタンスにコピーされることです (これはアクティベーション フレームの問題によるものですが、これは質問とはあまり関係がないため、これ以上詳しく説明しません)。入れ子になった型インスタンスの変数はもはや同じではないため、それらを final にする必要があるのはそのためです。

したがって、最初の例は次のとおりです。

void foo() {
    int a = 3;
    new Runnable() {
        @Override
        public void run() {
            a += 3;
        }
    };
}

匿名クラスのメソッドで非最終変数を参照できないため、これはコンパイルされません。の宣言に final 修飾子を追加すると、定義した匿名クラスの作成されたインスタンスにaの値がコピーされます。aただし、 の値を変更することはできません。これは、変更がが宣言されaたメソッドに表示されないためです。a

ただし、匿名クラスは静的ではありません。つまり、匿名クラスには、外側のインスタンスへの参照があり (宣言されているメソッドが静的でない限り)、外側のインスタンスの変数を変更するために使用できます。

int a = 3;

void foo() {
    new Runnable() {
        @Override
        public void run() {
            a += 3;
        }
    };
}

この例はコンパイルされ、匿名クラスのインスタンスaのメソッドが呼び出されるたびに 3 ずつ増加します。run()(この例では決して呼び出されませんが、これは単なる例です。)

したがって、要約すると、変数seatnoをメソッドローカル変数から外側の型のインスタンス変数に変換する必要があります。または、まだの場合は、final 変数は 1 回しか割り当てられないため、final 修飾子を削除する必要があります。

更新: Java 8 では、実質的な final変数の概念が導入されました ( Java 言語仕様を参照)。ただし、この投稿の最初の例では、変数aが複数回割り当てられているため、実質的に final になることができません。これは、この例がまだ Java 8 でコンパイルされないことを意味します。

于 2012-04-15T22:19:48.677 に答える
4

final 変数はその値を変更できません (C/C++ の const に似ています)。

おそらく、関数内のローカル変数ではなく、クラス内のフィールド (もちろん final キーワードなし) にしたいでしょう。

于 2012-04-15T22:03:02.600 に答える
0

の宣言を知らなくても、変数はそのメソッド内でのみ使用されるように見えるため、メソッドseatnoに新しい変数を導入することをお勧めします。これは最終的ではなく、現在と同じ仕事をします。mouseClicked()seatno

ところで: クラス名を大文字にします (dataである必要がありますData)。はるかに明確に見えます。

于 2012-04-15T22:02:58.933 に答える
0

final変数に修飾子がないことを確認してください。

//final, can be set only when the object is created.
private final String seatno;

//no final modifier, the value can be set every time you "want"
private String seatno;

また、文字列を比較するには、次を使用する必要がありますequals

if(anArray[x].equals("selected"))
于 2012-04-15T22:04:25.037 に答える