2012-04-18 44 views
6

Vì vậy, tôi chỉ tìm thấy ví dụ về mã trực tuyến này một thời gian trước và tôi sẽ xem lại nó một lần nữa nhưng khá bối rối.Java - Giao diện, khởi tạo một giao diện?

Từ khi nhìn vào nó, những gì tôi thu thập (và nó có thể sai) là nó chuyển sang phương thức in trong lớp NumberPrinter một đối tượng Máy in. Tuy nhiên, giao diện này còn được gọi là Máy in, vì vậy chúng ta có không khởi tạo một lớp ẩn danh của giao diện Máy in, xác định các phương thức và sau đó truyền nó không?

Câu hỏi cơ bản của tôi là, giả định ban đầu của tôi có đúng không? Và nếu vậy tôi nghĩ bạn không thể khởi tạo một giao diện?

public class NumberPrinter { 

    public interface Printer { 
     public void print (int idx); 
    } 

    public static void print (Printer p) { 
     for (int i = 0; i < 4; i++) { 
      p.print(i); 
     } 
    } 

    public static void main(String[] args) { 
     print(new Printer() { 

      @Override 
      public void print(int idx) { 
       System.out.println(idx); 
      } 

     }); 
    } 

} 
+0

Dường như đây có thể là câu hỏi trùng lặp. Hãy thử truy cập vào đây http://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – astidham2003

Trả lời

17

Đây được gọi là Lớp bên trong vô danh.

Nó tạo ra một lớp không được đặt tên thực hiện giao diện Printer.

+0

Ah, tôi nghĩ rằng tôi nhận được điều đó! – mino

3

Giả định của bạn là chính xác và bạn không thể khởi tạo giao diện. Bạn có thể khởi tạo một lớp ẩn danh tuy nhiên, đó là những gì mã đang làm.

+0

Vì vậy, bạn có thể khởi tạo một lớp bên trong vô danh của một giao diện? – mino

+0

Vâng, đó là chính xác. –

1

Bạn cần đối tượng Máy in cho chức năng in của NumberPrinter. Khi bạn gọi hàm đó, bạn không thực sự khởi tạo giao diện Máy in nhưng bạn nhanh chóng thực hiện nó và đây là lý do tại sao nó hoạt động.

Giả định của bạn là chính xác bằng cách này.

+0

Vì vậy, xin lỗi, tôi nhầm lẫn lý do tại sao bạn có thể vượt qua nó một lớp bên trong vô danh? Nó là một đối tượng của loại máy in? – mino

+0

Vì đây là lớp bên trong vô danh nên không có đối tượng để tham chiếu nên tôi không nghĩ có bất kỳ đối tượng Máy in nào ở đây. Cuộc gọi Printer() mới tạo ra một cá thể mới của lớp đó và trả về nó như là kết quả của câu lệnh. – Chris911