1

匿名の内部クラスを扱うときのインターフェースの概念について混乱しています。Javaでインターフェースをインスタンス化できないことを私が知っている限り、次のステートメントにはコンパイルエラーがあります

     ActionListener action = new ActionListener();  // compile error

匿名クラスを扱うとどうなりますか?なぜそれが使用を許可するのnewですか?例えば:

     JButton button = new JButton("A");
     button.addActionListener(new ActionListener(){    //this is fine
           @Override
           public void actionPerformed(ActionEvent e){

           }
     };

コンパイラはクラスを作成してActionListener舞台裏で実装するだけですか?それはどのように機能しますか?

4

4 に答える 4

5

実装を提供しているので、実装する新しい匿名クラスを作成できますActionListener。クラス名を付けているだけではありません。

于 2012-10-08T16:58:26.960 に答える
1

内部クラスを作成すると、インターフェイスを実装する匿名クラスがインスタンス化されます。

あなたの場合、効果は次と同じです:public class Foo implements ActionListener

于 2012-10-08T16:59:01.747 に答える
1

、などのよう1に順番に割り当てられた名前で内部クラスを定義します。同時に、キーワードで内部クラスをインスタンス化します。匿名で使用しているため、内部クラスの名前は気にしません。binディレクトリを見ると、匿名定義ごとのクラスファイルが表示されます。たとえば、クラスで匿名クラスを使用した場合、、が作成されます。これは、リフレクションを使用して、後日、より多くの匿名クラスをインスタンス化できることを意味すると思います。23newFooFoo.classFoo$1.class

于 2012-10-08T17:05:26.337 に答える
0

匿名クラスを使用する場合は、クラスを作成してインターフェイスを実装します。メソッドをオーバーライドするか、匿名クラス内にメソッドを実装できます。

    A a= new A(){ 

               }; 

ここで、aは、Aではなく、名前を持たないAを実装するクラスのオブジェクトを参照しているタイプAの参照変数です。

于 2012-10-08T17:00:22.037 に答える