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

96

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

Майк Райландер
источник
К сожалению, вы должны сделать конструктор видимым там, где иначе он бы не был.
Шридхар Сарнобат 01

Ответы:

99

Анонимные классы должны что-то расширять или реализовывать, как и любой другой класс 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 Когда вы «создаете новый» интерфейс, анонимный класс создается путем расширения класса «Object» и реализации этого интерфейса. Но пока вы «создаете новый» класс с помощью первого написанного вами выражения, анонимный класс (на самом деле, создается экземпляр этого анонимного класса) будет создан путем расширения этого класса.
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 или более интерфейсов в анонимной реализации.
Л. Холанда
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();
}
тиаго
источник
Именно это и предполагал ОП ИМХО
Даниэль Куадра
поставил большой палец за ответ на заданный вопрос. Это нормально для ТАК, что люди любят отвечать на то, что следует спрашивать, а не на то, что спрашивали.
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
источник
Я не вижу разницы. Чем твое отличается от моего.
trapedInBatcaveWithBAtman
красивый и компактный, в
твоем