2011-09-01 29 views
32

Từ The Java Tutorials:Giao diện dưới dạng một loại trong Java?

Trong Java, một lớp có thể kế thừa từ chỉ có một lớp nhưng nó có thể thực hiện hơn một giao diện. Do đó, các đối tượng có thể có nhiều loại: loại lớp của riêng chúng và loại của tất cả các giao diện mà chúng triển khai. Điều này có nghĩa là nếu biến số được khai báo là loại giao diện , giá trị của nó có thể tham chiếu bất kỳ đối tượng nào là được khởi tạo từ bất kỳ lớp nào triển khai giao diện.

Bất kỳ ai cũng có thể cung cấp cho tôi loại giả cơ bản cho việc này. Tôi không hiểu những dòng chữ đậm.

Trả lời

51

Hãy tuyên bố hai giao diện và một lớp mà thực hiện cả hai:

interface I1 { } 

interface I2 { } 

class C implements I1, I2 { } 

đối tượng có thể có nhiều loại

Trong đoạn mã sau, nó có thể được nhìn thấy rằng một C ví dụ có loại C cũng như I1I2:

C c = new C(); 

boolean isC = (c instanceof C); //true 
boolean isI1 = (c instanceof I1); //true 
boolean isI2 = (c instanceof I2); //true 

Bây giờ chúng ta hãy khai báo một lớp B mà thực hiện I1 cũng như:

class B implements I1 { } 

nếu một biến được khai báo là loại một giao diện, giá trị của nó có thể tham khảo bất kỳ đối tượng được khởi tạo từ bất kỳ lớp nào thực hiện giao diện.

Nếu chúng ta khai báo một biến kiểu I1, chúng ta có thể đặt nó vào một thể hiện của C, và sau đó chuyển nhượng lại cho một thể hiện của B:

I1 i1 = new C(); 
i1 = new B(); 

Chúng tôi cũng có thể gán nó vào một thể hiện của D, nơi D kéo dài C:

i1 = new D(); 

... 

class D extends C { } 
+0

được giải thích rất tốt – Thor

2

Báo cáo bạn trích dẫn (từ đâu?) Là đúng nhưng gây hiểu lầm - các đối tượng đã có nhiều loại không có giao diện. Ví dụ: "bimmelim" có loại String, nhưng cũng có loại Object. Giao diện không thay đổi điều đó, ngoại trừ "bimmelim"cũng có loại Serializable, CharSequence và các giao diện khác.

Trên thực tế, nó có thể là gây tranh cãi cho dù chúng ta nên nói rằng "bimmelim""has" loại Object, nhưng chắc chắn một tham chiếu đến nó sẽ phù hợp với một Object biến.

Nếu một biến được tuyên bố là loại một giao diện ... ví dụ

CharSequence x ; 

... thì giá trị của nó có thể tham khảo một đối tượng String như "bimmelim", hoặc nó có thể có thể là một StringBuffer, là một loại khác thực hiện CharSequence.

+0

+1 Đồng ý về báo giá đang gây hiểu lầm. –

1

Đó sau đây là một nhiệm vụ chính xác:

class AClass implements AInterface { 
} 


AInterface var = new AClass(); 
10

Hãy xem xét ví dụ sau:

Serializable s = new ArrayList(); 

Trong Java, đây là mã hợp lệ, mặc dù Serializable là một giao diện, vì ArrayList thực hiện Serializable . Vì vậy, trong trường hợp này, chúng tôi đang xử lý s dưới dạng biến số Serializable.

Bây giờ giả sử chúng ta theo dõi các mã trên như sau:

s = "String object"; 

Đây cũng là hợp lệ vì String cũng thực hiện Serializable. Vì chúng tôi đã khai báo s là loại Serializable, nên nó có thể trỏ đến đối tượng bất kỳ triển khai giao diện đó.

3
class Ball extends Rubber implements Jumping, Rolling, Squeezing { 
    public void jump(){} 
    public void roll(){} 
    public void squeeze(){} 
} 

Ball b = new Ball(); 
Jumping j = new Ball(); 
j.jump(); 
1

Hãy xem xét các lớp và giao diện định nghĩa sau đây:

public class A { } 

public class B extends A implements I { } 

public interface I { } 

Các câu sau đây đều là những quy phạm pháp luật:

A first = new A(); 
B second = new B(); 
A third = new B(); 
I fourth = new B(); 

Bởi vì B thực hiện I và kéo dài A, nó có thể được sử dụng như một giá trị bất kỳ ở đâu "I" hoặc "A" được mong đợi.

5

đối tượng có thể có nhiều loại

Hãy xem xét đoạn mã sau:

public class MyClass extends ParentClass implements Interface1, Interface2 {  
    //some code  
} 

Lớp này có thể được sử dụng ở những nơi khác nhau như sau:

MyClass m1 = new MyClass(); 
ParentClass p = new MyClass(); 
Interface1 i1 = new MyClass(); 
Interface2 i2 = new MyClass(); 

biến được tuyên bố là các loại một giao diện, giá trị của nó có thể tham chiếu bất kỳ đối tượng nào được khởi tạo từ bất kỳ lớp nào thực hiện giao diện.

Hãy xem xét hai dòng cuối cùng trong đoạn trước đó, một biến kiểu Interface1 có thể tham khảo bất kỳ đối tượng mà thực hiện giao diện này, vì vậy nếu chúng ta có một lớp học thực hiện Interface1, nói MyClass2, sau đó

Interface1 i1 = new MyClass(); 
Interface1 i2 = new MyClasss2(); 
i1 = i2; 
i1 = new MyClass2(); 

Tất cả các bài tập trước đó là hợp lệ vì MyClass và MyClass2 thực hiện Interface1

2

String thực hiện nhiều giao diện, vì vậy nó có nhiều loại:

String s = "A String"; 
Comparable<String> comp = s; 
CharSequece cs = s; 
Serializable ser = s; 

Giao diện CharSequence được thực hiện bởi nhiều lớp, do đó, một tài liệu tham khảo CharSequence có thể giữ tất cả các loại đối tượng:

CharSequence cs = "A String"; 
cs = new StringBuilder(); 
cs = new Segment(); 
1

Lấy giao diện Collection từ các thư viện chuẩn của Java là một ví dụ. Bất kỳ biến nào được khai báo là loại Collection sau đó có thể được chỉ định một đối tượng của lớp thực hiện giao diện Collection, ví dụ: ArrayList, Stack, ... xem tài liệu được liên kết để biết thêm ví dụ.

2

đối tượng có thể có nhiều loại

Ví dụ:

public class Foo implements Runnable, Callable<Integer> { 
    public void run() {} 
    public Integer call() {return 1;} 
} 

Foo foo = new Foo(); 
Runnable r = foo; 
Callable<Integer> c = foo; 

Ví dụ:

nếu một biến được khai báo là loại một giao diện, giá trị của nó có thể tham chiếu bất kỳ đối tượng nào được khởi tạo từ bất kỳ lớp nào thực hiện giao diện

Runnable r = new Foo(); 
r = Thread.currentThread(); //Thread implements Runnable 
2

example- Rất cơ bản

List<String> list1=new ArrayList<String>();

Từ, ArrayList thực hiện Danh sách do đó chúng ta có thể sử dụng Danh sách giao diện biến tức là list1 để tham khảo các đối tượng được tạo ra bởi ArrayList.

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