Як анонімний клас може розширити суперклас або реалізувати інтерфейс?
Як анонімний клас може розширити суперклас або реалізувати інтерфейс?
Відповіді:
Анонімні класи повинні розширювати або реалізовувати щось, як і будь-який інший клас 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()
{
..............
}
Тут анонімний клас реалізує Interface.
Class cl = new Class(){
.................
}
тут анонімний клас поширює абстрактний клас.