2012-07-02 40 views
15

tôi đến tình hình:Cùng một phương pháp trong giao diện và Abstract class

public interface Intr { 
    public void m1(); 
} 

public abstract class Abs { 
    public void m1() { 
     System.out.println("Abs.m1()"); 
    } 
    // public abstract void m1(); 
} 

public class A extends Abs implements Intr { 

    @Override 
    public void m1() { 
     // which method am I overriding, well it is Abs.m1() but why? 
     // if method implemented is Abs.m1(), then why I am not getting error for Intr.m1() not implemented. 
    } 

} 
+5

Bạn ghi đè cả hai. Có chuyện gì vậy? –

Trả lời

24

Bạn đang đáp ứng cả hai điều kiện cùng một lúc; I E. việc triển khai thực hiện đồng thời thực hiện các yêu cầu lớp trừu tượng và các yêu cầu giao diện.

Lưu ý, trừ khi bạn đang sử dụng Intr trong một chuỗi thừa kế khác, bạn không cần đến nó. Ngoài ra, nó có thể có ý nghĩa để di chuyển các implements Intr lên đến định nghĩa lớp trừu tượng.

5

Bạn chỉ có thể ghi đè các phương thức được xác định trong một lớp khác.

Phương thức được khai báo trong giao diện chỉ được triển khai. Sự khác biệt này tồn tại trong Java để giải quyết vấn đề thừa kế đa. Một lớp chỉ có thể mở rộng một lớp cha, do đó mọi cuộc gọi đến super sẽ được giải quyết mà không có sự mơ hồ. Tuy nhiên, các lớp có thể thực hiện một số giao diện, tất cả có thể khai báo cùng một phương thức. Tốt nhất là hãy nghĩ về các giao diện như một danh sách "phải có": để đủ điều kiện như là một Comparable cluss của bạn phải có phương thức compareTo() nhưng không quan trọng nó đến từ đâu hoặc giao diện nào khác yêu cầu cùng một phương thức.

Vì vậy, về mặt kỹ thuật bạn ghi đè Abs.m1() và thực hiện Intr.m1() trong một ngã swoop.

Lưu ý rằng đây sẽ là tốt quá:

public class B extends Abs implements Intr { 

    //m1() is inherited from Abs, so there's no need to override it to satisfy the interface 
} 
+0

Ngay cả trong trường hợp chúng tôi thực hiện một phương thức từ giao diện, chúng tôi viết @Override

+2

Vì vậy? Đó chỉ là một chú thích giúp việc tìm kiếm một loại lỗi nào đó dễ dàng hơn nhưng nó không phải là một phần của ngôn ngữ như vậy. Bạn có thể ghi đè các phương thức mà không bao giờ sử dụng chú thích '@ Override' nếu bạn muốn. – biziclop

+0

Tôi tự hỏi tại sao chúng tôi có Ghi đè và không triển khai cho các phương pháp chỉ thực hiện và không ghi đè ... – Trejkaz

0

@ Override đảm bảo bạn ghi đè lên các phương pháp không có giao diện khác biệt hay lớp cha trừu tượng. Vì vậy, không có lỗi với ghi đè.

Mặt khác Phương thức giao diện cũng được triển khai trong lớp siêu đủ cho hợp đồng Giao diện.

0

Ở đây cả giao diện và lớp trừu tượng đều có cùng phương thức.

Bạn có một tên lớp là chào và mở rộng lớp trừu tượng và thực hiện giao diện đúng và bạn ghi đè lên phương thức meth1 trên lớp hello và biên dịch chính xác và không đưa ra lỗi nào, nhưng bạn không thể xác định phương thức lớp nào ghi đè như lớp trừu tượng hoặc giao diện.

Đây là đa hình thời gian chạy, bạn không thể tạo đối tượng của lớp trừu tượng và giao diện nhưng bạn có thể tạo biến tham chiếu về điều đó. Ở đây giải pháp là bạn không thể xác định rằng trên thời gian biên dịch ghi đè thực tế của nó tại thời gian chạy.

interface hi 
{ 
    public void meth1(); 
} 
abstract class Hullo 
{ 
    public abstract void meth1(); 
} 
public class Hello extends Hullo implements hi 
{ 
    public void meth1(){ 
     System.out.println("hello"); 
    } 
     hi h= new Hello(); 
     h.meth1();//its means interface method is override. and its decide when we call method. 
     hullo hu= new Hello(); 
     hu.meth1();//its means abstract class method is override. 
} 
Các vấn đề liên quan