Як анонімний клас може використовувати “extends” або “implements”?


Відповіді:


98

Анонімні класи повинні розширювати або реалізовувати щось, як і будь-який інший клас Java, навіть якщо це просто java.lang.Object.

Наприклад:

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

Тут rє об’єкт анонімного класу, який реалізує Runnable.

Анонімний клас може розширити інший клас, використовуючи той самий синтаксис:

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

Що ви не можете зробити, так це реалізувати більше одного інтерфейсу. Для цього вам потрібен іменований клас. Однак ні анонімний внутрішній клас, ні іменований клас не можуть поширювати більше одного класу.


1
Я не думаю, що другий вираз є правильним. Ви вже оголосили назву класу як SomeClass, воно більше не є анонімним. Перевірте це посилання docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm Коли ви "новий" інтерфейс, анонімний клас створюється шляхом розширення класу "Об'єкт" та реалізації цього інтерфейсу. Але поки ви «створюєте» клас із першим написаним вами виразом, анонімний клас (насправді це екземпляр цього анонімного класу) буде створений шляхом розширення цього класу.
lixiang

8
@youmiss: Другий вираз створить екземпляр анонімного класу, який розширюється SomeClass. Це все ще анонімно через {...}.
skaffman

1
Бачу, я пропустив {...}.
lixiang

36

Анонімний клас зазвичай реалізує інтерфейс:

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
   }

 }

Мені подобається ця відповідь, оскільки вона зручна для Google людям, які шукають впровадження 2 або більше інтерфейсів у нереалізованій реалізації.
L. Holanda

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();
}

Це саме те, що задумав ОП ІМХО
Даніель Куадра

дав великі пальці за відповідь на задане питання. що нормально для 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()
{

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

}

Тут анонімний клас реалізує Interface.

Class cl = new Class(){

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

}

тут анонімний клас поширює абстрактний клас.


Я не бачу різниці. Чим ваш відрізняється від мого.
trapedInBatcaveWithBAtman

приємний та компактний, я сумую за тобою у відповіді - це слово на зразок "завжди" або "повинен" :)
kiedysktos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.