Một giao diện có thể mở rộng nhiều giao diện trong Java không?


126

Một giao diện có thể mở rộng nhiều giao diện trong Java không? Mã này xuất hiện hợp lệ trong IDE của tôi và nó biên dịch:

interface Foo extends Runnable, Set, Comparator<String> { }

nhưng tôi đã nghe nói rằng nhiều kế thừa không được phép trong Java. Tại sao dường như có một ngoại lệ cho các giao diện?


3
Những bài báo nói rằng nó không thể? Họ đã sai hoặc bạn hiểu nhầm họ và họ đang nói về các lớp hơn là giao diện.

7
Câu hỏi này dường như lạc đề vì nó có thể dễ dàng được trả lời bằng cách tự nghiên cứu
JoseK

4
@StephenC Nếu anh ấy tìm thấy bài viết mâu thuẫn, anh ấy nên đăng chúng. Bằng cách đó mọi người biết không đọc những bài báo đó ...
Nhưng tôi không phải là một lớp bao bọc

10
Câu trả lời cho câu hỏi này giúp tôi tiết kiệm thời gian. Tôi cho rằng nó có giá trị như một câu hỏi hợp lệ.
xdhmoore 30/03/2015

6
Câu hỏi hữu ích, tôi đã làm điều này để mong IDE của tôi đưa ra một số cảnh báo, đã rất ngạc nhiên khi không thấy gì. Vì vậy, tôi vô tình gõ vào google câu hỏi tương tự như câu hỏi đã đưa tôi đến trang này với một số câu trả lời / xác nhận
Arthur

Câu trả lời:


170

Có, bạn có thể làm điều đó. Một giao diện có thể mở rộng nhiều giao diện, như được hiển thị ở đây:

interface Maininterface extends inter1, inter2, inter3 {  
  // methods
}

Một lớp duy nhất cũng có thể thực hiện nhiều giao diện. Điều gì xảy ra nếu hai giao diện có một phương thức xác định cùng tên và chữ ký?

Có một điểm khó khăn:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

Sau đó, thực hiện duy nhất làm việc cho cả hai :).

Đọc bài viết đầy đủ của tôi ở đây:

http://codeinventions.blogspot.com/2014/07/can-interface-extend-mult Môn.html


@RahulBhadana Phương pháp trừu tượng nên ghi đè phải không?
Suresh Atta

13
Nếu bạn có giao diện A với void test()và giao diện B boolean test()thì sao? (Đây có phải là anh em họ của vấn đề kim cương không?) __Tried nó và điều hợp lý xảy ra: không được phép nếu loại trả lại khác nhau.
Daniel

@sureshatta - vậy chuyện gì xảy ra? nó gọi cả hai à ??
Fattie

4
Một lớp không cho phép 2 phương thức chữ ký giống nhau với kiểu trả về khác nhau. stackoverflow.com/questions/16149285/ từ
Ninh Phạm

73

Một giao diện có thể mở rộng nhiều giao diện .

Một lớp có thể thực hiện nhiều giao diện .

Tuy nhiên, một lớp chỉ có thể mở rộng một lớp duy nhất .

Cẩn thận cách bạn sử dụng các từ extendsimplementskhi nói về interfaceclass.


8

Một giao diện có thể mở rộng nhiều giao diện trong java không?

Trả lời là: Có.

Theo JLS

Một giao diện có thể được khai báo là phần mở rộng trực tiếp của một hoặc nhiều giao diện khác, nghĩa là nó chỉ định ngầm định tất cả các loại thành viên, phương thức trừu tượng và hằng số của các giao diện mà nó mở rộng, ngoại trừ mọi loại thành phần và hằng số mà nó có thể ẩn.


JLS = "Đặc tả ngôn ngữ Java" là nguồn có thẩm quyền trong các câu hỏi này.
Hontvári Levente

6

Từ trang tài liệu Oracle về nhiều loại thừa kế, chúng ta có thể tìm thấy câu trả lời chính xác ở đây . Ở đây trước tiên chúng ta nên biết loại đa thừa kế trong java: -

  1. Nhiều kế thừa của nhà nước.
  2. Nhiều kế thừa thực hiện.
  3. Nhiều kiểu thừa kế.

Java "không hỗ trợ nhiều kế thừa trạng thái, nhưng nó hỗ trợ nhiều kế thừa thực hiện với các phương thức mặc định kể từ khi phát hành java 8 và nhiều kế thừa kiểu với giao diện.

Sau đó, ở đây câu hỏi đặt ra cho "vấn đề kim cương" và cách Java giải quyết vấn đề đó: -

  1. Trong trường hợp nhiều kế thừa của trình biên dịch java thực hiện sẽ đưa ra lỗi biên dịch và yêu cầu người dùng sửa nó bằng cách chỉ định tên giao diện. Ví dụ ở đây: -

                interface A {
                    void method();
                }
    
                interface B extends A {
                    @Override
                    default void method() {
                        System.out.println("B");
                    }
                }
    
                interface C extends A { 
                    @Override
                    default void method() {
                        System.out.println("C");
                    }
                }
    
                interface D extends B, C {
    
                }

Vì vậy, ở đây chúng ta sẽ gặp lỗi như: - giao diện D kế thừa các mặc định không liên quan cho phương thức () từ các loại giao diện B và C D mở rộng B, C

Bạn có thể sửa nó như: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. Trong nhiều kế thừa kiểu java cho phép vì giao diện không chứa các trường có thể thay đổi và chỉ có một triển khai sẽ thuộc về lớp nên java không đưa ra bất kỳ vấn đề nào và nó cho phép bạn làm như vậy.

Trong phần Kết luận, chúng ta có thể nói rằng java không hỗ trợ nhiều kế thừa trạng thái nhưng nó hỗ trợ nhiều kế thừa thực hiện và nhiều kế thừa kiểu .


1
Tôi nghĩ rằng đây là một câu trả lời phù hợp hơn và làm rõ hơn cho câu hỏi. +1
Ketan Joshi

Cảm ơn bạn @KetanJoshi điều này thúc đẩy rất nhiều để tiếp tục :)
shankar upadhyay

4

Bạn có thể mở rộng nhiều Interfacesnhưng bạn không thể mở rộng nhiềuclasses .

Lý do mà Java không thể mở rộng nhiều lớp, là trải nghiệm tồi từ C ++ khi điều này là có thể.

Thay thế cho kế thừa nhiều lần là một lớp có thể thực hiện nhiều giao diện (hoặc Giao diện có thể mở rộng nhiều Giao diện)


2

Tôi nghĩ rằng sự nhầm lẫn của bạn nằm trong nhiều kế thừa, trong đó thực tế là không tốt và trong Java điều này cũng không thể thực hiện được. Tuy nhiên, việc thực hiện nhiều giao diện được cho phép trong Java và nó cũng an toàn.


2

Một lớp Java chỉ có thể mở rộng một lớp cha. Nhiều di sản không được phép. Tuy nhiên, các giao diện không phải là các lớp và một giao diện có thể mở rộng nhiều hơn một giao diện cha.

ví dụ: hãy xem tại đây: http://www.tutorialspoint.com/java/java_interfaces.htmlm

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.