Как анонимный класс может использовать «расширяет» или «реализует»? - PullRequest
86 голосов
/ 01 мая 2011

Как анонимный класс может расширить суперкласс или реализовать интерфейс?

Ответы [ 5 ]

91 голосов
/ 01 мая 2011

Анонимные классы должны расширять или реализовывать что-либо, как любой другой класс Java, даже если это просто java.lang.Object.

Например:

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

Здесь r - это объект анонимного класса, который реализует Runnable.

Анонимный класс может расширять другой класс, используя тот же синтаксис:

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

Чего вы не можете сделать, так это реализовать более одного интерфейса. Вам нужен именованный класс, чтобы сделать это. Однако ни анонимный внутренний класс, ни именованный класс не могут расширять более одного класса.

33 голосов
/ 01 мая 2011

Анонимный класс обычно реализует интерфейс:

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

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

Если вы имеете в виду, можете ли вы реализовать 2 или более интерфейсов, я думаю, что это невозможно. Затем вы можете сделать закрытый интерфейс, который объединяет оба. Хотя я не могу легко представить, почему вы хотите, чтобы у анонимного класса это было:

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

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

 }
15 голосов
/ 01 мая 2011

Анонимные классы всегда расширяют суперкласс или реализуют интерфейсы. например:

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

Более того, хотя анонимный класс не может реализовывать несколько интерфейсов, вы можете создать интерфейс, расширяющий другой интерфейс, и позволить вашему анонимному классу реализовать его.

3 голосов
/ 01 мая 2011
// 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 голос
/ 15 июня 2015

Анонимный класс расширяется или реализуется при создании своего объекта Например:

Interface in = new InterFace()
{

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

}

Здесь анонимный класс реализует интерфейс.

Class cl = new Class(){

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

}

здесь анонимный класс расширяет абстрактный класс.

...