簡體   English   中英

是否可以通過繼承和接口在一個類中兩次存在相同的方法?

[英]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在選擇運行哪種方法時一定不要有任何困惑,這意味着哪種方法會被覆蓋。 但是我還是很困惑。 為什么要編譯該程序?

否-同一方法不能在一個類中存在兩次。

接口只是聲明了一個類來實現特定方法的要求 它實際上並沒有創建該方法。

因此,通過繼承獲取方法實現的類已定義了該方法。 此(單個)實現滿足接口的要求。

在您的情況下:

  1. Dog延伸Canine ,因此這意味着該roam()從方法Canine是可用的,並作為如果沒有覆蓋上狗的方法對象將被暴露。
  2. 但是隨后Dog便用其自己的roam()定義覆蓋了超類的方法。 這是允許的,在Dog上仍然只有一個明確的方法稱為roam() -新的覆蓋。
  3. 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.

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