[英]Upcasting/Downcasting in Java
我試圖了解 Java 中的向上轉換和向下轉換,我對以下情況感到困惑(關於我的代碼,如下所示):
首先 - 為什么當我包含行myAnimal.bark();
,
第二 - (假設我注釋掉myAnimal.bark();
)為什么調用 myAnimal.move myAnimal.move()
打印"moveDog"
而不是"moveAnimal"
? myAnimal
是否僅限於Animal
class 的方法,因為我們已將其類型聲明為Animal
,即使我們將其設置為Dog
類型?
非常感謝任何幫助:這是代碼:
public class Animal {
public void move() {
System.out.println("moveAnimal");
}
public static void main(String[] args) {
Dog myDog = new Dog();
Animal myAnimal = myDog;
myAnimal.move();
//myAnimal.bark();
}
}
class Dog extends Animal {
@Override
public void move() {
System.out.println("moveDog");
}
public void bark() {
System.out.println("bark");
}
}
這里有兩個重要的概念相互競爭。
第一個概念是static typing ,這意味着 Java 編譯器會在編譯時檢查您的表達式、變量和方法的類型,然后才能運行代碼。 在這種情況下,變量myAnimal
的類型是Animal
,而Animal
類型沒有方法bark()
,所以myAnimal.bark()
是一個類型錯誤。
第二個概念是動態分派,即在運行時根據object的類型來選擇方法實現。 由於myAnimal
持有對 class Dog
的 object 的引用,因此對move()
方法的調用會調用Dog
class 中提供的該方法的實現。
使用此行的隱式向上轉換:
Animal myAnimal = myDog;
您沒有做任何事情來更改底層實例myDog
。 您正在做的是將其分配給 inheritance 樹中更高一級類型的變量。 實際上,這將哪些方法限制為只能調用Animal
中定義的方法,但不會改變這些方法的解析方式。
因為您已將可用方法限制為僅在父 class Animal
上定義的方法,所以編譯器無法解析Dog#bark()
,因為它是Dog
的方法,並且變量myAnimal
被定義為沒有#bark
的Animal
類型#bark
法。
#move()
是Animal
和Dog
的方法,因此它解析,但它解析為Dog
上定義的方法,因為myAnimal
仍然引用Dog
的實例,盡管被向上轉換。
在這里,您將 myAnimal 聲明為 Animal 並且每只動物都不能吠叫。 即 myAnimal 在這里指的是動物。
動物 myAnimal = myDog;
但可以肯定的是,Dog 是一種可以吠叫的動物,因此您需要通過讓 JVM 知道它的類型是 Dog 而不是 Just Animal 來明確地投射您的 myAnimal。
所以如果你改變 //myAnimal.bark(); 低於它會工作!
((狗) myAnimal).bark();
在這里,我們將 myAnimal 從 Animal 轉換為 Dog。 因此 bark() 方法是允許的,它不會產生任何編譯問題。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.