[英]referencing new objects with super/subclass references JAVA
我目前正在學習Java,無法理解此主題。 用超類引用子類對象。 在瀏覽了多個網站和帖子后,我的困惑才剛剛增加。 示例代碼:
public abstract class Bird {
private void fly() {
System.out.println("Bird is flying");
}
public static void main(String[] args) {
Bird bird = new Pelican();
bird.fly();
}
}
class Pelican extends Bird {
protected void fly() {
System.out.println("Pelican is flying");
}
}
輸出是Bird在飛-為什么?
我也有3個問題:
Bird bird = new Pelican();
在以上部分中,我可以用什么代替Bird類型(如果還有更多擴展Bird的類)? 我正在為OCA 1考試做准備,與此主題有關的問題使我非常困惑。
使用這些引用時輸出什么方法和變量? 在上面的示例中,創建了鵜鶘對象,但是運行的fly方法是bird?
如果完成了轉換,我可以使用什么類型,不能使用什么類型?
在stackoverflow和其他Java網站上對此有多個問題,但是有多個來源,多個答案使我感到困惑。 我知道時間很寶貴,但是有人可以為我徹底消除這個疑問嗎?
提前致謝。
在ur Bird抽象類中,fly方法是私有的。 您不能繼承或覆蓋私有方法:因此
class Pelican extends Bird {
protected void fly() { System.out.println("Pelican is flying"); }
}
實際上並沒有覆蓋父方法。
此外,由於無法調用引用類的私有方法,並且在Bird類中, fly方法是Private ,因此代碼存在編譯問題 。
再次編譯代碼。
歡迎使用Java多態!
首先,您不能創建抽象類的實例,這是導致編譯問題的原因。
輸出不是“ Pelican正在飛行 ”,因為私有方法不能被覆蓋,因為您正在使用Bird引用(Parent類)創建Pelican對象(Child類)。
Bird bird = new Pelican();
如果您想要所需的輸出“ Pelican is flying ”,則還需要Child類的引用。
Pelican bird = new Pelican();
為了讓您從子類中調用方法,您必須使用方法重寫,這也稱為運行時多態。 由於您聲明的對象是Bird,並且它具有不能被覆蓋的fly私有方法,因此您的輸出將是“ Bird is flying”。
但是,如果您將其初始化為
鵜鶘pelican = new Pelican();
那么輸出將是“鵜鶘飛翔”
您可以在這里閱讀更多有關它的信息https://www.geeksforgeeks.org/dynamic-method-dispatch-runtime-polymorphism-java/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.