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


回答:


98

匿名クラス、たとえ他のJavaクラスと同じように、何かを拡張または実装する必要がありjava.lang.Objectます。

例えば:

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

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

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

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

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


1
2番目の表現は正しいとは思いません。クラスの名前はすでにSomeClassとして宣言されていますが、匿名ではありません。このリンクを確認してくださいdocstore.mik.ua/orelly/java-ent/jnut/ch03_12.htmインターフェースを「新規」にすると、「オブジェクト」クラスを拡張してそのインターフェースを実装することにより、匿名クラスが作成されます。しかし、最初に記述した式でクラスを「更新」している間、そのクラスを拡張することにより、匿名クラス(実際、その匿名クラスのインスタンスが作成されます)が作成されます。
lixiang

8
@youmiss:2番目の式は、拡張する匿名クラスのインスタンスを作成しますSomeClass。のため、まだ匿名{...}です。
skaffman

1
わかりました、{...}を見落としました。
lixiang

36

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

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
   }

 }

anonの実装に2つ以上のインターフェースを実装することを探している人々にとって、それはグーグルフレンドリーなので、私はこの答えが好きです。
L.ホランダ

16

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

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

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


11

誰もその質問を理解していなかったと思います。この男が欲しかったものは次のようなものだったと思います:

return new (class implements MyInterface {
    @Override
    public void myInterfaceMethod() { /*do something*/ }
});

これにより、複数のインターフェースの実装などが可能になります。

return new (class implements MyInterface, AnotherInterface {
    @Override
    public void myInterfaceMethod() { /*do something*/ }

    @Override
    public void anotherInterfaceMethod() { /*do something*/ }
});

これは本当に素晴らしいでしょう。ただし、Javaでは許可されていません

あなたができることは、メソッドブロック内でローカルクラスを使用することです:

public AnotherInterface createAnotherInterface() {
    class LocalClass implements MyInterface, AnotherInterface {
        @Override
        public void myInterfaceMethod() { /*do something*/ }

        @Override
        public void anotherInterfaceMethod() { /*do something*/ }
    }
    return new LocalClass();
}

まさに、これがOPが
IMHOを

質問に答えるために親指を与える。これはSOでは通常のことであり、人々は尋ねられたことに対してではなく、尋ねられるべきものに答えることを好みます。
mfaisalhyder

3
// 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!"); }
    }
);

1

匿名クラスは、オブジェクトの作成中に拡張または実装されます。次に例を示します。

Interface in = new InterFace()
{

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

}

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

Class cl = new Class(){

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

}

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


違いはわかりません。あなたのものは私のものとどう違うのですか。
trapedInBatcaveWithBAtman 2015年

素敵でコンパクトなもの、私があなたの答えに欠けているのは「常に」または「必須」のような言葉です:)
kiedysktos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.