[英]Can a same method exist in a class twice, through Inheritance and interfaces?
這是場景:-
class Canine{
public void roam(){
System.out.println("Canine-Roam");
}
}
public interface Pet{
public abstract void roam();
}
class Dog extends Canine implements Pet{
public void roam(){
System.out.println("Dog Roam");
}
public static void main(String [] args){
Dog adog = new Dog();
adog.roam();
}
}
我知道JVM在選擇運行哪種方法時一定不要有任何困惑,這意味着哪種方法會被覆蓋。 但是我還是很困惑。 為什么要編譯該程序?
否-同一方法不能在一個類中存在兩次。
接口只是聲明了一個類來實現特定方法的要求 。 它實際上並沒有創建該方法。
因此,通過繼承獲取方法實現的類已定義了該方法。 此(單個)實現滿足接口的要求。
在您的情況下:
Dog
延伸Canine
,因此這意味着該roam()
從方法Canine
是可用的,並作為如果沒有覆蓋上狗的方法對象將被暴露。 Dog
便用其自己的roam()
定義覆蓋了超類的方法。 這是允許的,在Dog
上仍然只有一個明確的方法稱為roam()
-新的覆蓋。 Dog
實現Pet
,這意味着需要具有roam()
方法。 確實如此-因此這是此接口的有效實現。 您的情況很好,它將運行正常並輸出Dog Roam
。 這意味着Dog
類中的函數將運行。
您沒有得到任何編譯時錯誤,因為Dog中的方法正在實現在接口中聲明的抽象方法,並且恰好與此方法的方法簽名與父類匹配。
我認為您會混淆兩件事:
Canine.roam()
和Dog.roam()
Pet.roam()
顯然,在兩個類中有roam()
兩個“實現”:
Canine.roam()
Dog.roam()
同一類中永遠不會有兩個相同的方法。
並且由於Dog
擴展了Canine
,因此方法Canine.roam()
被覆蓋。 您的main()
函數使用 Dog.roam()
代替。
您已經為Dog類型創建了對象,並將其分配給Dog引用類型。
覆蓋過多,與此處無關。 盡管您從犬類擴展了Dog類,但它們都是2種不同的類型。
在編譯時,編譯器檢查方法定義是否存在於引用類型中。 而已。 它必須存在於此。 在運行時,JVM首先檢查引用類型中的方法,然后查找“引用類型的”子類中存在的相同方法的任何替代版本。
如果存在,它將被執行。 否則,將執行引用類型的方法。
即
Canine c=new Dog();
將執行Dog的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.