簡體   English   中英

哪個方法將被接口或類覆蓋?

[英]Which Method will get override from interface or class?

在下面的程序中,我擴展了 Demo1 類並實現了 Demo 接口,在實踐類中,我覆蓋了在類和接口中聲明的public void demo() ,然后該方法將從哪個方法中獲得覆蓋? 為什么?

 interface Demo{
        void demo();
    }

class Demo1{
    int i=10;
    public void demo() {
       System.out.println("this is demo"+i);
    }
}
public class practice extends Demo1 implements Demo {
    public static void Main(String[] args ) {
        practice p=new practice();
        p.demo();
               
    }
    
    public void demo() {
        System.out.println("This is Overrided method");
    }
}

簡短的回答是沒關系。 編譯器正在尋找的是抽象接口方法的簽名是在您的類中實現的,還是從超類型繼承的(並且它不關心該繼承的簽名是否旨在實現有問題的抽象方法)。
並且您的demo()方法是否在聲明為DemoDemo1practice對象上調用也無關,方法簽名以任何一種方式實現。

事實上,您甚至可以刪除您的demo()覆蓋(假設您不需要更改行為),並且代碼仍會編譯:

class practice extends Demo1 implements Demo {
    public static void Main(String[] args) {
        practice p = new practice();
        p.demo();
    }
}

也就是說,即使Demo1.demo()Demo.demo()無關,但實際上practice繼承了與Demo1.demo()具有相同簽名的Demo.demo()並且不違反訪問和異常約束,這使得practice成為Demo的有效實現。

來自接口的方法沒有被覆蓋,它被實現了

你的練習繼承Demo1類的demo方法,如果你在練習類本身中省略了demo方法的實現,這個方法將用於實現Demo接口方法。

由於您在實踐類本身中實現了演示方法 - 該方法覆蓋Demo1類中的方法,並且還實現Demo接口中的方法

如果你運行下面的代碼

public class practice extends Demo1 implements Demo {
public static void main(String[] args ) {
    practice p=new practice();
    p.demo();
           
}

public void demo() {
    System.out.println("This is Overrided method");
}
}

輸出將是“這是覆蓋方法”,如果您對演示方法進行評論,如下所示

public class practice extends Demo1 implements Demo {
public static void main(String[] args ) {
    practice p=new practice();
    p.demo();
           
}

/*public void demo() {
    System.out.println("This is Overrided method");
}*/
}

輸出將是“這是demo10”。 在第一種情況下,當類對象在 self 中找到 demo 的定義時,它將優先於父類。

Demo1 提供了 demo() 的實現。 所以它將采用父 demo() 方法。 輸出將是

這是demo10

但是隨后您在子類實踐中再次實現了覆蓋 demo() 方法

所以現在輸出

這是重載方法

暫無
暫無

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

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