使用子類引用與超類引用引用子類物件


在 Java 繼承中,一些基本規則包括:

  • 超類(父類)與子類(子類)之間存在物件關係,而子類與父類物件關係則不存在。這意味著父類引用可以持有子類物件,而子類引用不能持有父類物件。

  • 在重寫非靜態方法的情況下,執行時物件將評估執行子類方法還是超類方法。而靜態方法的執行取決於物件持有的引用型別。

  • 繼承的另一個基本規則與靜態和非靜態方法的重寫有關,Java 中的靜態方法不能被重寫,而非靜態方法可以。但是,子類可以定義與超類具有相同靜態方法簽名的靜態方法,但這不被視為重寫,而是被稱為隱藏超類的靜態方法。

基於上述規則,我們將透過程式觀察不同的場景。

示例

 現場演示

class Parent {
   public void parentPrint() {
      System.out.println("parent print called");
   }
   public static void staticMethod() {
      System.out.println("parent static method called");
   }
}
public class SubclassReference extends Parent {
   public void parentPrint() {
      System.out.println("child print called");
   }
   public static void staticMethod() {
      System.out.println("child static method called");
   }
   public static void main(String[] args) {
      //SubclassReference invalid = new Parent();//Type mismatch: cannot convert from Parent to          SubclassReference
      Parent obj = new SubclassReference();
      obj.parentPrint(); //method of subclass would execute as subclass object at runtime.
      obj.staticMethod(); //method of superclass would execute as reference of superclass.
      Parent obj1 = new Parent();
      obj1.parentPrint(); //method of superclass would execute as superclass object at runtime.
      obj1.staticMethod(); //method of superclass would execute as reference of superclass.
      SubclassReference obj3 = new SubclassReference();
      obj3.parentPrint(); //method of subclass would execute as subclass object at runtime.
      obj3.staticMethod(); //method of subclass would execute as reference of subclass.
   }
}

輸出

child print called
parent static method called
parent print called
parent static method called
child print called
child static method called

因此,使用超類引用和使用子類引用進行引用的區別在於,使用超類引用可以持有子類物件,並且只能訪問子類中定義/重寫的方法,而使用子類引用不能持有超類物件,並且可以訪問超類和子類的方法。

更新於: 2020年6月25日

3K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.