2015-08-02 21 views
6

Tôi đã đọc Java SCJP cuốn sách của Khalid A. Mughal (ví JE6), và trong chủ đề 7,6 giao diện và trang số 313, nó được cho rằnggiao diện - phương pháp ghi đè không được thừa kế

Một subinterface có thể ghi đè khai báo phương thức trừu tượng từ các siêu kết nối của nó. Các phương thức ghi đè không được kế thừa.

Tôi không thể hiểu được những gì "Phương pháp ghi đè không được kế thừa". có nghĩa là. Tôi đã cố gắng thực hiện điều này:

interface A 
{ 
    void abc(); 
} 

interface B extends A 
{ 
    @Override 
    void abc(); 
} 

interface C extends B 
{ 
    void abc(); 
} 

Và tôi đã không nhận được bất kỳ lỗi nào. Tôi không hiểu gì?

+0

Phương pháp ghi đè không áp dụng cho giao diện, chỉ các lớp. –

+0

Nhưng trong cuốn sách được nói trong ngữ cảnh của 'giao diện ' –

+0

Trong Java 8, giao diện có thể có các triển khai mặc định cho các phương thức nhưng trong các phiên bản trước khái niệm ghi đè không có giao diện wrt có ý nghĩa. –

Trả lời

2

Điều này đơn giản có nghĩa là các phương thức ghi đè có thể có chữ ký hơi khác so với các phương thức của siêu kết nối. Ví dụ:

public interface Foo { 
    Object doSomething(String input) throws IOException; 
} 

public interface Bar extends Foo { 
    @Override 
    String doSomething(String input); 
} 

Như bạn thấy, trong giao diện con, tôi không còn ném ngoại lệ đã kiểm tra nữa và tôi đảm bảo rằng đối tượng trả về là loại cụ thể hơn. Phương thức đã làm ném ngoại lệ đã chọn không được kế thừa, bởi vì nó bị ghi đè.


Tôi không có bối cảnh của toàn bộ đoạn văn, nhưng có điều gì đó khác liên quan mà chỉ áp dụng cho việc triển khai và không giao diện, đó là nếu bạn ghi đè lên một phương pháp mà không gọi một cách rõ ràng super, của lớp cha việc triển khai sẽ không xảy ra.

Ví dụ, nếu tôi có:

public class Example { 
    public static class Foo { 
    public void printSomething() { 
     System.out.println("Foo"); 
    } 
    } 

    public static class Bar extends Foo { 
    @Override 
    public void printSomething() { 
     System.out.println("Bar"); 
    } 
    } 

    public static void main(String[] args) { 
    Bar bar = new Bar(); 
    bar.printSomething(); 
    } 
} 

Chương trình này sẽ chỉ đơn giản là kết quả:

Bar 

nhưng KHÔNG Foo. Nếu tôi thêm một cuộc gọi đến super.printSomething(), sau đó nó sẽ in cả hai.

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