2011-12-06 30 views
8

tôi đang học Java, tôi thấy liên quan mô tả sau đây để giao diện trong một cuốn sách:biến kiểu giao diện

Khi một biến được khai báo là có một kiểu giao diện, nó chỉ đơn giản có nghĩa là đối tượng dự kiến ​​sẽ triển khai giao diện đó.

Điều đó có nghĩa là gì? Nếu tôi xác định một giao diện :

public interface Myinterface{ 

    void method_one(); 
    int method_two(); 
} 

Sau đó, tôi tuyên bố một biến là một loại giao diện ví dụ:

Myinterface foo = new Myinterface(); 
  • Làm thế nào giao diện được thực hiện ??
  • Trong trường hợp nào tôi nên xác định biến loại giao diện?

Tôi hoàn toàn bị lẫn lộn bởi mô tả của cuốn sách ...

Trả lời

13

Bạn không thể nhanh chóng một giao diện, ví dụ: bạn không thể làm

MyInterface foo = new MyInterface(); // Compile-time error. 

Những gì bạn có thể làm là tạo một lớp mà thực hiện giao diện. Đó là, cho một lớp MyClass

public class MyClass implements MyInterface { 
    // ... 

    @Override 
    void method_one() { 
    // ... 
    } 
    @Override 
    int method_two() { 
    // ... 
    } 
} 

bạn có thể nhanh chóng nó và đặt một tham chiếu đến nó trong biến của bạn như thế này:

MyInterface foo = new MyClass(); 

Nếu bạn đã có một lớp thực hiện MyInterface

class MyClass2 implements MyInterface { 
    // ... 
} 

bạn cũng có thể thay thế tham chiếu đến thể hiện của lớp này theo biến của bạn:

MyInterface foo = new MyClass2(); 

Đây là nơi mà sức mạnh của giao diện nằm: họ xác định loại, không phải là một đặc biệt thực hiện và cho phép bạn tham khảo bất cứ thi hành một loại nhất định.

Nó là một thực hành lập trình rất tốt để làm cho các lớp thực hiện các giao diện và sử dụng chúng để chỉ các thể hiện của các lớp này.Thực hành này tạo điều kiện thuận lợi cho sự linh hoạt và tái sử dụng.

Do đó, bạn nên sử dụng đối số và kiểu biến giao diện bất cứ khi nào có thể hiểu rằng các triển khai khác nhau có thể được chuyển vào phương pháp bạn đang triển khai. Ví dụ: nếu bạn đang làm việc với một cá thể HashSet<T>, bạn nên sử dụng một biến loại Set<T> để tham chiếu đến nó (lớp HashSet<T> triển khai giao diện Set<T>).

+0

Cảm ơn bạn, cả bạn và Macmade đều cho tôi một lời giải thích rõ ràng. – Mellon

1

Bạn không khởi tạo một giao diện. Bạn tạo các lớp học mà triển khai giao diện, khởi tạo giao diện đó, nhưng tham chiếu giao diện (trái ngược với lớp triển khai).

Điều này cho phép mã của bạn duy trì mức trung bình thực hiện, tương tự như việc sử dụng tham chiếu List, nhưng thực hiện ArrayList.

Khi được kết hợp với tiêm phụ thuộc, việc kiểm tra và mở rộng cũng dễ dàng hơn nhiều.

3

Bạn không thể khởi tạo giao diện. Nhưng bạn có thể gõ biến của bạn với tên giao diện:

Myinterface foo = new MyObject(); 

Giả sử MyObject cụ MyInterface. Ví dụ:

Có thể hữu ích khi mua các đối tượng từ nguồn bên ngoài.
Trong trường hợp này, bạn không biết (và không quan tâm) về loại thực của đối tượng.

Bạn chỉ cần biết và đảm bảo nó triển khai một số giao diện, vì vậy bạn có thể gọi các phương thức giao diện trên đối tượng.

Giả sử bạn có biến sau đây:

Myinterface foo; 

Và hai lớp (FooBar), cả hai thực hiện MyInterface.
Sau đó, bạn có thể chỉ định các biến số foo với các phiên bản của cả hai FooBar.

Điều tương tự cũng áp dụng cho các đối số phương thức, tất nhiên.

+0

Cảm ơn bạn, Bạn cũng có thể trả lời câu hỏi thứ 2 của tôi, trong trường hợp nào tôi nên làm điều này? Tại sao nó như thế này? Lợi ích là gì? – Mellon

+0

Chỉ cần thêm điều này:) – Macmade

+0

Cảm ơn bạn, cả bạn và Adam cho tôi một lời giải thích rất rõ ràng :) – Mellon

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