簡體   English   中英

用父/子類引用新對象引用JAVA

[英]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();
  1. 在以上部分中,我可以用什么代替Bird類型(如果還有更多擴展Bird的類)? 我正在為OCA 1考試做准備,與此主題有關的問題使我非常困惑。

  2. 使用這些引用時輸出什么方法和變量? 在上面的示例中,創建了鵜鶘對象,但是運行的fly方法是bird?

  3. 如果完成了轉換,我可以使用什么類型,不能使用什么類型?

在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.

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