[英]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_animal
是Dog
對象。
檢出: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.