2012-07-02 62 views
15

我來的情況:相同方法

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

你壓倒了兩者。有什麼問題? –

回答

24

您滿足同時兩個條件;即。一個實現同時滿足抽象類需求和接口需求。

請注意,除非您在另一個繼承鏈中使用Intr,否則不需要它。此外,將implements Intr移至抽象類定義可能有意義。

5

您只能覆蓋另一個類中定義的方法。

接口中聲明的方法只是實現。 Java中存在這種區別來解決多繼承問題。一個類只能擴展一個父類,因此任何對super的調用都將毫不含糊地解決。類然而可以實現幾個接口,它們都可以聲明相同的方法。最好將界面視爲「必須擁有」的列表:要符合Comparable的要求,您的線索必須具有compareTo()方法,但不管它來自哪裏或其他界面需要相同方法。

因此,從技術角度而言,您可以覆蓋Abs.m1()並實施Intr.m1()一舉。

注意,這將是罰款太:

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

即使在從接口實施方法的情況下,也寫@Override

+2

那麼?這只是一個註釋,它使查找某種類型的錯誤更容易,但它不屬於這種語言的一部分。如果你願意,你可以重寫方法而不用'@ Override'註解。 – biziclop

+0

我不知道爲什麼我們有覆蓋,而不是執行的方法,只是實施,而不是重寫... – Trejkaz

0

@覆蓋,確保您覆蓋與無差異接口或抽象超類中的方法。所以沒有覆蓋錯誤。

從另一方面接口方法也在超級類中實現,這對於接口契約是足夠的。

0

這裏接口和抽象類都有相同的方法。

你有一個類名是hello,exteds抽象類和實現接口它的真,你覆蓋甲方法上hello類它的罰款和它的編譯正確,沒有給出任何錯誤,但她不能確定哪個類方法是重寫像抽象類或接口。

這是運行時多態,你不能創建抽象類和接口的對象,但是你可以創建它的引用變量。這裏的解決方案是你無法在編譯時識別它在運行時的實際覆蓋。

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. 
}