使用子類引用與超類引用引用子類物件
在 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
因此,使用超類引用和使用子類引用進行引用的區別在於,使用超類引用可以持有子類物件,並且只能訪問子類中定義/重寫的方法,而使用子類引用不能持有超類物件,並且可以訪問超類和子類的方法。
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP