[英]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
有沒有辦法訪問Animal
的compareTo
? 從邏輯上講,我不希望能夠比較PolarBear
的動物品質以及PolarBear
品質嗎?
將bobo
對象轉換為PolarBear
, Animal
或Comparable
並不重要,對象的運行時類型將始終為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.