0

ActionListener はインターフェイスですが、インスタンス オブジェクトを作成できるのはなぜですか?

   JButton button = new JButton("Button1");

   ActionListener me = new ActionListener(){
        public void actionPerformed(ActionEvent ae){
            JOptionPane.showMessageDialog(null,ae.getActionCommand());  
        }
    };
    button.addActionListener(me);

それとも他に何ですか?私はわかりません。私を助けてください。

4

9 に答える 9

6

ここに表示されているのは匿名クラスと呼ばれるものです。インターフェイスmeを実装する匿名 (名前のない) クラスのインスタンスが割り当てられます。ActionListener

于 2012-08-23T16:23:23.723 に答える
4

C# とは異なり、Java のインターフェイスはコンストラクターを規定できません。

java.lang.Objectコードで行っていることは、拡張する (既定のコンストラクターを持っている)匿名クラスを作成し、インターフェイスを実装することです。

于 2012-08-23T16:23:55.697 に答える
2

インスタンス化したのは、匿名の内部クラスです。つまり、名前のないクラスを定義し、そのクラスのインスタンスを1つのステートメントでインスタンス化するインラインの方法です。匿名の内部クラスは、それらが実装または拡張するスーパークラスによってのみ参照できます。この質問の場合、スーパークラスはActionListenerインターフェースです。

コードをコンパイルすると、次のような名前の追加の.classファイルが存在しますOuterClass$1.class。これは、定義した匿名の内部クラスを表すクラスファイルです。

詳細については、JLShttp://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.5のこのセクションを確認してください

于 2012-08-23T16:27:11.657 に答える
1

ActionListenerは、実際にはインスタンス化できないインターフェイスです。

ただし、public void actionPerformed()をローカルで定義することにより、インターフェースがクラスのように動作できるようになります。

これは合法です:

 ActionListener me = new ActionListener(){
      public void actionPerformed(...){...};
 };

これではありません:

ActionListener me = new ActionListener();
于 2012-08-23T16:27:25.143 に答える
1

匿名クラスでインターフェースを実装しているため

于 2012-08-23T16:23:49.620 に答える
1

ActionListenerそれ自体がインターフェイスです。

ただし、コード内のコンストラクトは匿名の内部クラスです。つまり、インターフェイスはその内部クラスによって実装されています。

于 2012-08-23T16:24:14.800 に答える
1

実際、作成しているのはObject.class、インターフェースを実装する の匿名サブクラスです。したがって、インターフェイスからではなく、オブジェクトからコンストラクターを「継承」しています。

于 2012-08-23T16:24:15.393 に答える
1

のインスタンスを作成していませんActionListener。実装する匿名クラスを作成してActionListenerおり、その実装を提供しています。

于 2012-08-23T16:24:37.203 に答える
0

1.Javaに参加することはできません。constructorInterface

2.ここで見たのは、Anonymous Class宣言と初期化が同時に行われるであり、クラスまたはインターフェイスをそれぞれ拡張または実装する必要があります。

于 2012-08-23T17:08:41.687 に答える