Как анонимный класс может расширить суперкласс или реализовать интерфейс?
Как анонимный класс может расширить суперкласс или реализовать интерфейс?
Ответы:
Анонимные классы должны что-то расширять или реализовывать, как и любой другой класс Java, даже если это просто java.lang.Object
.
Например:
Runnable r = new Runnable() {
public void run() { ... }
};
Вот r
объект анонимного класса, который реализует Runnable
.
Анонимный класс может расширять другой класс, используя тот же синтаксис:
SomeClass x = new SomeClass() {
...
};
Чего вы не можете сделать, так это реализовать более одного интерфейса. Для этого вам нужен именованный класс. Однако ни анонимный внутренний класс, ни именованный класс не могут расширять более одного класса.
SomeClass
. Он по-прежнему анонимен из-за доменного имени {...}
.
Анонимный класс обычно реализует интерфейс:
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
}
}
Анонимные классы всегда расширяют суперкласс или реализуют интерфейсы. например:
button.addActionListener(new ActionListener(){ // ActionListener is an interface
public void actionPerformed(ActionEvent e){
}
});
Более того, хотя анонимный класс не может реализовывать несколько интерфейсов, вы можете создать интерфейс, расширяющий другой интерфейс, и позволить вашему анонимному классу реализовать его.
Думаю, никто не понял вопроса. Думаю, этому парню было что-то вроде этого:
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();
}
// 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!"); }
}
);
Анонимный класс расширяется или реализуется при создании своего объекта. Например:
Interface in = new InterFace()
{
..............
}
Здесь анонимный класс реализует интерфейс.
Class cl = new Class(){
.................
}
здесь анонимный класс расширяет абстрактный класс.