簡體   English   中英

為什么子類引用不能在java中保存超類對象

[英]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.

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