Làm thế nào một lớp ẩn danh có thể sử dụng “extension” hoặc “implements”?


96

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?


Thật không may, bạn phải làm cho hàm tạo hiển thị ở những nơi mà nếu không thì nó sẽ không có.
Sridhar Sarnobat

Câu trả lời:


98

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, rlà 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.


1
Tôi không nghĩ rằng biểu thức thứ hai là đúng. Bạn đã khai báo tên của lớp là SomeClass, nó không còn ẩn danh nữa. Kiểm tra liên kết này docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm Khi bạn "mới" một giao diện, một lớp ẩn danh được tạo bằng cách mở rộng lớp "Đối tượng" và triển khai giao diện đó. Nhưng trong khi bạn đang "tạo mới" một lớp với biểu thức đầu tiên bạn đã viết, một lớp ẩn danh (Thực tế, đó là một phiên bản của lớp ẩn danh đó được tạo) sẽ được tạo bằng cách mở rộng lớp đó.
lixiang

8
@youmiss: Biểu thức thứ 2 sẽ tạo một thể hiện của một lớp ẩn danh mở rộng SomeClass. Nó vẫn còn ẩn danh, do {...}.
skaffman

1
Tôi hiểu rồi, tôi đã bỏ qua {...}.
lixiang

36

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
   }

 }

Tôi thích câu trả lời này vì nó thân thiện với google cho những người đang tìm cách triển khai 2 hoặc nhiều giao diện trong triển khai anon.
L. Holanda

16

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ó.


11

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();
}

Chính xác, đây là những gì OP dự định IMHO
DanielCuadra

givng thích khi trả lời câu hỏi đã hỏi. điều bình thường trên SO rằng mọi người thích trả lời những gì nên hỏi chứ không phải những gì đã được hỏi.
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

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.


Tôi không thấy sự khác biệt. Của bạn khác với của tôi như thế nào.
trapedInBatcaveWithBAtman

một tốt đẹp và một nhỏ gọn, những gì tôi bỏ lỡ trong bạn trả lời là từ như "luôn luôn" hoặc "phải" :)
kiedysktos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.