簡體   English   中英

在Java中,引用子類引用的超類變量的實際類是什么?

[英]In Java, what is the actual class for a superclass variable that is referencing a subclass reference?

我對Java還是很陌生,對Java如何處理引用子類引用的超類變量感到有些困惑。 我有兩節課:

public class Animal{
}
public class Dog extends Animal{
}

然后我創建了一個Run類,如下所示:

public class Run{
    public void get_dog (Dog a){
        System.out.println("got a dog");
    }
    public static void main(String[] args) {
        Animal a_animal = new Dog(); //Create a Animal variable with Dog class
        Run test = new Run();
        System.out.println(a_animal.getClass().getSimpleName());
        test.get_dog(a_animal); //This will not run
    }
}

getClass()。getSimpleName()告訴我a_animal的類為Dog。 但是test.get_dog(a_animal)不會運行,說get_name()將只使用Dog類而不是Animal類。 那么a_animal的類到底是什么?

根據您的代碼,您應該將Animal對象傳遞給get_dog方法,而不是Dog對象。 您嘗試過的操作稱為“向上轉換”。 父類的引用變量引用子類的對象,如下所示。

 Animal a_animal = new Dog();

在此處輸入圖片說明

我為您重新編寫了代碼,以了解以下概念

public class Animal {
    void run() {
        System.out.println("An animal is running");
    }
}


public class Dog extends Animal {
    void run() {
        System.out.println("Dog is running in 20kmph");
    }
}



public class Run{
    public static void main(String[] args) {
        Animal a_animal = new Dog(); //Creating a reference variable of Animal class by referring to Dog class (upcasting)
        a_animal.run();//
    }
}

以下是結果

在此處輸入圖片說明

說明

我們通過Parent類的引用變量來調用run方法。 因為它引用了子類對象,並且子類方法覆蓋了Parent類方法,所以在運行時將調用子類方法。

方法調用是由JVM而不是編譯器確定的,這被稱為運行時多態。

嘗試這個:

 test.get_dog((Dog)a_animal); 

get_dog()方法期望使用Dog對象作為參數。 由於a_animal首先被初始化為Animal類,因此您需要顯式地將其轉換為Dog對象,以便它知道a_animalDog對象。

檢出:Java中的多態和類型轉換

這里的困惑是靜態類型與動態類型之一。 在編譯時,編譯器將a_animal變量稱為Animal 嘗試將其用作Dog失敗,因為編譯器知道並非所有Animal實例都是dog(即Animal不是Dog,也不是Dog的子類)。

在運行時, a_animal將引用一條Dog,並且該調用將起作用。 若要查看其運行情況, test.get_dog(a_animal)更改為test.get_dog((Dog) a_animal) -此(Dog)a_animal類型a_animal ,告訴編譯器將a_animal視為Dog類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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