web-dev-qa-db-ja.com

匿名クラスは「拡張」または「実装」をどのように使用できますか?

匿名クラスはどのようにしてスーパークラスを拡張したり、インターフェースを実装したりできますか?

88
user707549

匿名クラス必須他のJavaクラスのように、単にJava.lang.Objectであっても、何かを拡張または実装します。

例えば:

Runnable r = new Runnable() {
   public void run() { ... }
};

ここで、rは、Runnableを実装する匿名クラスのオブジェクトです。

匿名クラスは、同じ構文を使用して別のクラスを拡張できます。

SomeClass x = new SomeClass() {
   ...
};

できないことは、複数のインターフェイスを実装することです。それには名前付きクラスが必要です。ただし、匿名の内部クラスも名前付きクラスも、複数のクラスを拡張できません。

93
skaffman

通常、匿名クラスはインターフェイスを実装します。

new Runnable() { // implements Runnable!
   public void run() {}
}

JFrame.addWindowListener( new WindowAdapter() { // extends  class
} );

2以上のインターフェイスを実装できるかどうかを意味する場合、それは不可能だと思います。その後、2つを組み合わせたプライベートインターフェイスを作成できます。なぜ匿名クラスにそれを持たせたいのか簡単には想像できませんが:

 public class MyClass {
   private interface MyInterface extends Runnable, WindowListener { 
   }

   Runnable r = new MyInterface() {
    // your anonymous class which implements 2 interaces
   }

 }
33
extraneon

匿名クラス常にスーパークラスを拡張するか、インターフェースを実装します。例えば:

button.addActionListener(new ActionListener(){ // ActionListener is an interface
    public void actionPerformed(ActionEvent e){
    }
});

さらに、匿名クラスは複数のインターフェースを実装できませんが、他のインターフェースを拡張するインターフェースを作成し、匿名クラスに実装させることができます。

15
MByD
// The interface
interface Blah {
    void something();
}

...

// Something that expects an object implementing that interface
void chewOnIt(Blah b) {
    b.something();
}

...

// Let's provide an object of an anonymous class
chewOnIt(
    new Blah() {
        @Override
        void something() { System.out.println("Anonymous something!"); }
    }
);
3

匿名クラスは、オブジェクトの作成中に拡張または実装しています。たとえば、

Interface in = new InterFace()
{

..............

}

ここでは、匿名クラスがインターフェイスを実装しています。

Class cl = new Class(){

.................

}

ここで、匿名クラスは抽象クラスを拡張しています。