2013-07-01 39 views
8

Có thể tạo đối tượng cho một giao diện không, nếu có thì chúng ta có thể như thế nào? theo quan điểm của tôi đoạn mã sau nói rằng chúng ta có thể:Tôi có thể tạo đối tượng cho giao diện không?

Runnable r= new Runnable(){ // some implementation }

+0

Không, bạn không thể. Ngoài ra, tất cả các lớp kế thừa từ Object, trong khi giao diện không – Ankit

+0

Bạn đã thử nó chưa? Trong ví dụ của bạn, bạn tạo một cá thể của một lớp ẩn danh thực hiện giao diện. – Axel

+0

Khái niệm liên quan: https://stackoverflow.com/questions/33994009/can-we-create-object-of-abstract-class –

Trả lời

11

Bạn không thể nhanh chóng một giao diện trực tiếp, nhưng bạn có thể tạo một lớp mà thực hiện giao diện:

public class RunClass implements Runnable { 
    // Class implementation 
} 

Runnable r = new RunClass(); 

này về cơ bản giống như những gì bạn đang làm nội tuyến. Các dấu ngoặc sau Runnable mới() sẽ chứa nội tuyến triển khai của bạn.

+5

Đây là một chút gây hiểu nhầm. Câu hỏi của OP sử dụng cú pháp lớp ẩn danh, có lẽ là điểm. –

14

Đây không phải là tạo ra thể hiện của Giao diện, nó đang tạo một lớp thực hiện giao diện. Vì vậy, khi bạn viết

Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

     } 
    }; 

Bạn đang thực sự tạo một lớp đang triển khai giao diện Runnable. Bạn cần phải làm theo tất cả các quy tắc ở đây, ở đây, chúng ta đang trọng phương pháp chạy cho Runnable

There is similar thing for abstract class also. We can test using an example 

public abstract class AbstractClass { 

    public void someMethod(){ 
     System.out.println("abstract class"); 
    } 

} 

và một ví dụ lớp TestClass

public class TestClass { 

    public static void main(String[] args) { 

     AbstractClass abstractClass = new AbstractClass() { 
      public void someMethod() { 
       System.out.println("concrete class method"); 
      } 
     }; 
     abstractClass.someMethod(); 
    } 
} 

Điều này sẽ tạo ra các thể hiện của một lớp con, trong đó chúng tôi ghi đè someMethod(); Chương trình này in

concrete class method 

Điều này chứng minh chúng tôi đang tạo ra thể hiện của phân lớp.

+0

cảm ơn nó là câu trả lời hay nhất –

6

Có thể tạo đối tượng cho giao diện không?

No. Mã bạn đã hiển thị tạo đối tượng từ một lớp vô danh , thực hiện giao diện. Dưới các nắp, JVM thực sự tạo ra một lớp thực hiện giao diện, và sau đó tạo ra một cá thể của lớp đó.


Lớp "vô danh" được tạo ra sẽ thực sự có một cái tên, dựa vào tên của lớp, trong đó mã này xuất hiện, ví dụ YourClass$1 hoặc tương đương. Ví dụ:

public class AnonymousName { 
    public static final void main(String[] args) { 
     Runnable r = new Runnable() { 
      public void run() { 
      } 
     }; 

     System.out.println(r.getClass().getName()); 
    } 
} 

... đầu ra

AnonymousName$1

;

(Ít nhất là trên JVM của Oracle Tôi không biết nếu quy ước đặt tên là trong JLS hoặc nếu đó là hành vi JVM cụ thể.)
0

chúng tôi không thể instatiate giao diện (vì không có hàm tạo).

+0

Tôi không nghĩ như vậy Rais. Có thể bạn có thể giải quyết vấn đề của mình. Nó trông hoàn toàn trả lời cho tôi. –

+1

câu trả lời của bạn là chính xác. Tôi đoán nơi thích hợp là bình luận và không trả lời. –

8

Bạn có thể tạo một lớp bên trong vô danh:

Runnable r = new Runnable() { 
    @Override 
    public void run() { 
    } 
}; 

Vì vậy, bạn tạo ra một class mới mà thực hiện các trao interface.

0

Những gì bạn thấy là anonymous inner class.

nó đang tạo một phiên bản mới, ẩn danh, triển khai lớp Runnable.

Do định nghĩa lớp ẩn danh là biểu thức, nên phải là một phần của câu lệnh.

Các vấn đề liên quan