Tại sao một giao diện không thể thực hiện một giao diện khác?


104

Ý của tôi là:

interface B {...}

interface A extends B {...} // allowed  

interface A implements B {...} // not allowed

Tôi truy cập vào Google và tôi tìm thấy điều này :

implementsbiểu thị xác định một triển khai cho các phương thức của một giao diện. Tuy nhiên, giao diện không có triển khai nên điều đó là không thể.

Tuy nhiên, interface là một lớp trừu tượng 100% và một lớp trừu tượng có thể triển khai các giao diện (lớp trừu tượng 100%) mà không cần thực thi các phương thức của nó. Vấn đề là gì khi nó được xác định là "giao diện"?

Về chi tiết,

interface A {
    void methodA();
}

abstract class B implements A {} // we may not implement methodA() but allowed

class C extends B {
   void methodA(){}
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B

Câu trả lời:


110

implementscó nghĩa là thực hiện, khi nào interfaceđược dùng để khai báo chỉ để cung cấp interfacekhông thực hiện.

100% về mặt abstract classchức năng tương đương với một interfacenhưng nó cũng có thể được triển khai nếu bạn muốn (trong trường hợp này, nó sẽ không còn là 100% abstract), vì vậy từ quan điểm của JVM, chúng là những thứ khác nhau.

Ngoài ra, biến thành viên trong lớp trừu tượng 100% có thể có bất kỳ định tính truy cập nào, trong đó chúng được ngầm định trong một giao diện public static final.


8
Đối với Java 8, Giao diện có thể có các phương thức mặc định, làm cho chúng giống với các Lớp trừu tượng hơn về mặt đó.
forresthopkinsa

4
Cảm ơn bạn vì câu cuối cùng!
Tao Zhang

24

implementsnghĩa là một hành vi sẽ được định nghĩa cho abstractcác phương thức (rõ ràng là ngoại trừ các lớp trừu tượng), bạn xác định việc triển khai.

extends có nghĩa là một hành vi được kế thừa.

Với các giao diện, có thể nói rằng một giao diện phải có cùng hành vi với giao diện khác, thậm chí không có một triển khai thực tế nào. Đó là lý do tại sao nó có ý nghĩa hơn đối với một giao diện sang extendsmột giao diện khác thay vì triển khai nó.


Một lưu ý nhỏ, hãy nhớ rằng ngay cả khi một abstractlớp có thể định nghĩa abstractcác phương thức (theo cách thông thường của một giao diện), nó vẫn là một lớp và vẫn phải được kế thừa (mở rộng) và không được thực thi.


4

Về mặt khái niệm, có hai lớp và giao diện "miền". Bên trong các miền này, bạn luôn mở rộng, chỉ một lớp triển khai một giao diện, kiểu "vượt biên". Vì vậy, về cơ bản "mở rộng" cho các giao diện phản ánh hành vi cho các lớp. Ít nhất tôi nghĩ rằng đây là logic đằng sau. Có vẻ như không phải tất cả mọi người đều đồng ý với loại logic này (bản thân tôi thấy nó hơi sai), và thực tế là không có lý do kỹ thuật nào để có hai từ khóa khác nhau cả.


Nếu "Y kéo dài X" và không được niêm phong, thì có thể có một loại "Z" khác kéo dài "Y". Điều đó sẽ đúng cho dù X là một giao diện hay một lớp. Tuy nhiên, nếu "W thực hiện X", thì không thể có "V thực hiện W". Thực tế là "mở rộng" có thể được "xâu chuỗi" và "thực hiện" có vẻ như là một lý do chính đáng cho việc có các từ khóa khác nhau.
supercat

2

Tuy nhiên, interface là lớp trừu tượng 100% và lớp trừu tượng có thể triển khai giao diện (100% lớp trừu tượng) mà không cần thực thi các phương thức của nó. Vấn đề là gì khi nó được xác định là "giao diện"?

Đây chỉ đơn giản là một vấn đề của quy ước. Các tác giả của ngôn ngữ java quyết định rằng "mở rộng" là cách tốt nhất để mô tả mối quan hệ này, vì vậy đó là những gì chúng ta sử dụng.

Nói chung, mặc dù giao diện là "một lớp trừu tượng 100%", chúng tôi không nghĩ về chúng theo cách đó. Chúng ta thường nghĩ về các giao diện như một lời hứa để triển khai các phương thức chính nhất định hơn là một lớp để lấy từ đó. Và do đó, chúng tôi có xu hướng sử dụng ngôn ngữ khác nhau cho các giao diện hơn là cho các lớp.

Như những người khác đã nêu, có những lý do chính đáng để chọn "mở rộng" hơn "nông cụ".


Vâng thưa ngài. Đó là một vấn đề của quy ước. Nhiều người cố gắng biện minh một cách hợp lý những hạn chế trong ngôn ngữ Java gốc của Sun, khi đó chỉ là quan điểm cá nhân. Nếu trình biên dịch có thêm giao diện "triển khai", tôi đoán những người tương tự cũng sẽ biện minh cho điều đó. :-)
Little Santi

1

Hy vọng điều này sẽ giúp bạn một chút những gì tôi đã học được trong oops (core java) trong thời gian học đại học của tôi.

Triển khai biểu thị xác định một triển khai cho các phương thức của một giao diện. Tuy nhiên, giao diện không có triển khai nên điều đó là không thể. Tuy nhiên, một giao diện có thể mở rộng một giao diện khác, có nghĩa là nó có thể thêm nhiều phương thức hơn và kế thừa kiểu của nó.

Đây là một ví dụ dưới đây, đây là hiểu biết của tôi và những gì tôi đã học được rất tiếc.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

và hãy ghi nhớ một điều rằng một giao diện chỉ có thể mở rộng giao diện khác và nếu bạn muốn xác định chức năng của nó trên một số lớp thì chỉ có một giao diện trong được triển khai, ví dụ bên dưới

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

Bây giờ, nếu một lớp triển khai giao diện này, thì nó sẽ trông như thế nào:

public class SomeClass implements Dog
{
    public boolean Barks{
    // method definition here

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

và nếu một lớp trừu tượng có một số hàm trừu tượng được định nghĩa và khai báo và bạn muốn định nghĩa hàm đó hoặc bạn có thể nói hiện thực các hàm đó thì bạn giả sử mở rộng lớp đó vì lớp trừu tượng chỉ có thể được mở rộng. đây là ví dụ dưới đây.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

Đây là một lớp con ví dụ của MyAbstractClass:

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}

0

Giao diện giống như một sự trừu tượng không cung cấp bất kỳ chức năng nào. Do đó, nó không 'thực hiện' mà mở rộng các giao diện hoặc giao diện trừu tượng khác.


-6

Interface là lớp chứa một phương thức trừu tượng không thể tạo bất kỳ đối tượng nào, vì Interface không thể tạo đối tượng và nó không phải là một lớp thuần túy, nên nó không có giá trị thực hiện nó.

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.