簡體   English   中英

Java 中的上調/下調

[英]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被定義為沒有#barkAnimal類型#bark法。

#move()AnimalDog的方法,因此它解析,但它解析為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.

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