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