[英]why subclass reference can't hold superclass object in java
class One{
}
class Two extends One{
}
class Main{
public static void main(String[] args){
Two t = new One(); // invalid
}`
}
我無法理解其背后的原因,為什么子類引用不能保存父類的對象,而超類引用可以保存子類的對象。
因為狗具有動物的所有行為,但只知道是動物的東西並不能保證具有狗的所有行為。
每個孩子都是父母,但不是每個父母都是孩子。 繼承規則。
TWO 的類型不能是 ONE 的實例,因為存在 TWO 具有而 ONE 沒有的成員和方法。 但是,ONE 的類型可以引用TWO,因為TWO 擁有ONE 所擁有的一切。
例如,如果一個可以行走,兩個也可以運行,那么如果你有一個類型為 ONE 的對象,那么它需要能夠行走。 因此,如果 ONE 引用了兩個有效,因為兩個可以走路。
但是當你有一個類型為 TWO 的對象時,它需要能夠運行,所以你不能將它引用到一個不能運行的對象。
如果我們從集合論的角度考慮,與父類相比,子類是一個超集。 與父類相比,子類具有所有可能的屬性和方法。
因此,父類對象可以引用其子類對象,因為子類對象包括父類的方法和屬性。 反之亦然,由於父類對象不具備子類所需的所有方法和屬性,因此子類對象不能引用父類對象。
考慮類二包含一個方法,比如說demo()。
class One{
}
class Two extends One {
void demo(){
System.out.println("in Two");
}
}
class Main{
public static void main(String[] args){
Two t = new One(); // Suppose this is valid at compilation time
t.demo();
}
}
現在假設當我們創建類 One 的對象時編譯器沒有給我們錯誤,即子引用保存父對象的對象。 進一步 t 是類二的引用,因此 t.demo() 是有效的。
現在當程序運行時,引用 t 包含類 One 的對象。 當程序到達 t.demo() 時,t 包含類 One 的對象,而類 One 沒有任何名為 demo() 的方法。
因此,為了防止此類錯誤,編譯器會檢查對象是否為引用類型,即對象類是否與引用類或引用類的子類相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.