1

重複の可能性:
別のメソッドで定義された内部クラス内の非最終変数を参照できません

私はただ実験していて、質問があります。

匿名の内部クラスから非最終クラス変数にアクセスしているときに、これが受け入れられるのはなぜですか。

static JLabel e = new JLabel("");
    public static void main(String[] args) {

        JButton b = new JButton("ok");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                String l = e.getText();

            }

        });

    }

ただし、最後の修飾子がないと、次のことは受け入れられません。

4

3 に答える 3

3

クラス変数は静的であるためです。

于 2012-05-09T22:00:14.350 に答える
2

クラスを少し下に変更しました。うまくいけば、これはあなたが答えを見るのを助けることができます。

e.getText()SomeClass.e.getText()元のコードでは、以下のコードの省略形です。SomeClassと同様の参照を行うことができるのと同じパッケージ内の任意のクラスe.

一方、同じパッケージ内の他のクラスSomeClassは参照できませんargs

class SomeClass {
    static JLabel e = new JLabel("");
    public static void main(String[] args) {

        JButton b = new JButton("ok");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                String l = SomeClass.e.getText();

            }

        });

    }
}
于 2012-05-09T22:08:48.907 に答える
-2

私は数日前に他の誰かにこの質問に答えました

答えは、argsがスコープのコンテキスト外にあるということです。最終的でない場合は、actionPerformedメソッドが呼び出されるまでに変更されている可能性があります。その場合、argsを、まだ存在する場合と存在しない場合がある別のスタックフレーム上の場所として扱っています。これは、Javaでは間違いなくノーノーです。args finalを宣言すると、変数を内部クラスにコピーできます

于 2012-05-09T21:59:26.667 に答える