Làm thế nào để một lớp ẩn danh có thể mở rộng một lớp cha hoặc triển khai một giao diện?
Làm thế nào để một lớp ẩn danh có thể mở rộng một lớp cha hoặc triển khai một giao diện?
Câu trả lời:
Các lớp ẩn danh phải mở rộng hoặc triển khai một cái gì đó, giống như bất kỳ lớp Java nào khác, ngay cả khi nó chỉ là java.lang.Object
.
Ví dụ:
Runnable r = new Runnable() {
public void run() { ... }
};
Đây, r
là một đối tượng của một lớp ẩn danh mà thực hiện Runnable
.
Một lớp ẩn danh có thể mở rộng một lớp khác bằng cách sử dụng cùng một cú pháp:
SomeClass x = new SomeClass() {
...
};
Những gì bạn không thể làm là triển khai nhiều hơn một giao diện. Bạn cần một lớp được đặt tên để làm điều đó. Tuy nhiên, cả một lớp bên trong ẩn danh hay một lớp được đặt tên đều không thể mở rộng nhiều hơn một lớp.
SomeClass
. Nó vẫn còn ẩn danh, do {...}
.
Một lớp ẩn danh thường triển khai một giao diện:
new Runnable() { // implements Runnable!
public void run() {}
}
JFrame.addWindowListener( new WindowAdapter() { // extends class
} );
Nếu ý bạn là liệu bạn có thể triển khai 2 hoặc nhiều giao diện hay không, thì tôi nghĩ điều đó là không thể. Sau đó, bạn có thể tạo một giao diện riêng tư kết hợp cả hai. Mặc dù tôi không thể dễ dàng hình dung tại sao bạn lại muốn một lớp ẩn danh có điều đó:
public class MyClass {
private interface MyInterface extends Runnable, WindowListener {
}
Runnable r = new MyInterface() {
// your anonymous class which implements 2 interaces
}
}
Các lớp ẩn danh luôn mở rộng lớp cha hoặc triển khai các giao diện. ví dụ:
button.addActionListener(new ActionListener(){ // ActionListener is an interface
public void actionPerformed(ActionEvent e){
}
});
Hơn nữa, mặc dù lớp ẩn danh không thể triển khai nhiều giao diện, bạn có thể tạo một giao diện mở rộng giao diện khác và cho phép lớp ẩn danh của bạn thực hiện nó.
Tôi đoán không ai hiểu câu hỏi. Tôi đoán những gì anh chàng này muốn là một cái gì đó như thế này:
return new (class implements MyInterface {
@Override
public void myInterfaceMethod() { /*do something*/ }
});
bởi vì điều này sẽ cho phép những thứ như triển khai nhiều giao diện:
return new (class implements MyInterface, AnotherInterface {
@Override
public void myInterfaceMethod() { /*do something*/ }
@Override
public void anotherInterfaceMethod() { /*do something*/ }
});
điều này thực sự sẽ thực sự tốt đẹp; nhưng điều đó không được phép trong Java .
Những gì bạn có thể làm là sử dụng các lớp cục bộ bên trong các khối phương thức:
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!"); }
}
);
Một lớp ẩn danh đang mở rộng hoặc triển khai trong khi tạo đối tượng của nó Ví dụ:
Interface in = new InterFace()
{
..............
}
Ở đây lớp ẩn danh đang thực hiện Giao diện.
Class cl = new Class(){
.................
}
ở đây Lớp ẩn danh đang mở rộng một Lớp trừu tượng.