簡體   English   中英

接口和抽象類中的方法相同

[英]Same method in Interface and 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.
    }

}

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

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

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

接口中聲明的方法僅被實現。 Java中存在此區別以解決多重繼承問題。 一個類只能擴展一個父類,因此任何對super調用都將被明確地解決。 但是,類可以實現多個接口,這些接口都可以聲明相同的方法。 最好將接口視為“必須具備”的列表:要獲得可Comparable的資格,您的主管必須具有compareTo()方法,但無論它來自何處或其他接口要求使用哪種方法都無關緊要。

因此,從技術上講,您可以Abs.m1()重寫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
}

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

您有一個類名是hello,並消除了抽象類,並實現了它的true,並且在hello類上重寫了meth1方法,它很好並且可以正確編譯,並且沒有給出任何錯誤,但是她無法像抽象類那樣標識哪個類方法被重寫或界面。

這是運行時多態,您不能創建抽象類和接口的對象,但是可以創建其引用變量。 這里的解決方案是您無法在編譯時確定其在運行時的實際覆蓋率。

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

@Override確保您無差別地重寫該方法Interface或抽象超類。 因此,覆蓋沒有錯誤。

另一方面,在超類中也實現了接口方法,這對於接口協定已經足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM