簡體   English   中英

Java接口和繼承與多態

[英]Java Interfaces and Inheritance and Polymorphism

為了概念上理解繼承,接口和多態,我創建了幾個類來測試事物。 我得到的結果不是我預期的結果。 代碼如下:

public class Animal implements Comparable{
//Animal constructor & methods
public int compareTo(Object arg0){System.out.println("Animal.compareTo");}
}

public class Bear extends Animal{
//Bear constructor & methods
}

public class PolarBear extends Bear implements Comparable{
//PolarBear constructor & methods
public int compareTo(Object arg0) {System.out.println("PolarBear.compareTo");

我沒有得到任何錯誤,說我無法再次實現Comparable。 但是在我的測試中,一旦我創建了PolarBear,我就無法回到Animal的compareTo方法,即使PolarBear應該繼承Animal的compareTo。 我測試了以下內容:

Animal bobo = new PolarBear();
bobo.compareTo(null);
((PolarBear) bobo).compareTo(null);
((Animal)bobo).compareTo(null);
((Comparable) bobo).compareTo(null);    

並且他們每個人印刷:

 PolarBear.compareTo

有沒有辦法訪問AnimalcompareTo 從邏輯上講,我不希望能夠比較PolarBear的動物品質以及PolarBear品質嗎?

bobo對象轉換為PolarBearAnimalComparable並不重要,對象的運行時類型將始終為PolarBear因為您將其實例化為

Animal bobo = new PolarBear();

因此,無論何時調用.compareTo(wtv)它都會調用PolarBear實現。

這就是多態性。 閱讀后期綁定,因為這是在java中實現polymorphishm的方式。

如果要調用父類的compareTo(wtv)方法,則必須在任何其他子類的方法中執行super.compareTo(wtv)

compareTo和inheritence通常是一個棘手的業務 理論上,擁有可比較的具體超類的子類會打破可比較的合同。 例如 - 假設我有一個超類A,它通過檢查字段a1和a1與其他A進行比較。 現在讓我們添加一個具有額外字段b1的子類B. anA.compareTo(aB)將比較a1和a2而((A)aB).compareTo(anA)不會做同樣的事情
至於你的問題 - 你可以通過做類似的事情從子類本身調用compareTo的Animal版本

super.compareTo(<something>)

但不是來自“外部”,因為你已經覆蓋了這個方法。 您有責任與您剛剛覆蓋的方法保持與外界相同的“合同”。

您始終可以從PolarBear中調用super.compareTo(arg0)來調用Animal.compareTo中的邏輯。

這很簡單。 底層對象是PolarBear類,您每次都要更改對象的接口(用於保存對象引用的Class)。

JVM在編譯時檢查接口中的方法(用於保存對象引用的類)是否存在,但是綁定是在運行時進行的,因為Child(PolearBear)具有該方法,因此它將始終運行該方法。

使用super.compareTo()來調用父方法。

暫無
暫無

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

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