簡體   English   中英

Java多態性轉換-運行時錯誤ClassCastException

[英]Java polymorphism casting - runtime error ClassCastException

我在這里有此代碼:

public class code {

    public static void main(String args[]){

        Animal ani1 = new Animal();
        Animal ani2 = new Dog();

        Dog d1 = (Dog)ani1; //runtime error ClassCastException
        Dog d2 = (Dog)ani2;
    }
}

class Animal {
    public String name = "animal";
    public void talk(){
        System.out.println("Animal");
    }
}

class Dog extends Animal {
    public String name = "dog";
    public void talk(){
        System.out.println("Dog");
    }
}

我不理解為什么通常會發生運行時錯誤並向下轉換。 將創建2個對象,一個Animal對象和一個Dog對象。 每個變量都由Animal類型的變量引用。

我認為Java不會為d1指定Animal類型的對象,因為d1被聲明為Dog類型。 但是令我困惑的是ani1ani2都是Animal類型,應該可以向下轉換為Dog嗎? 唯一的區別是一個引用Animal對象,另一個引用Dog對象。

Java是否知道ani1引用了Animal對象,並且不允許d1分配引用了Animal對象的變量?

VGR說的是正確的,您無法更改某些內容。 僅在這里進行轉換才能幫助我們的代碼在編譯過程中識別出它是什么。

考慮ff示例:

Animal ani1 = new Cat();
Animal ani2 = new Dog();

Dog dog1 = (Dog) ani1; // will produce a runtime error
Dog dog2 = (Dog) ani2;

就像給定的示例一樣,您不能僅通過強制轉換就簡單地將Cat更改為Dog Dog永遠是AnimalAnimal不能永遠是Dog

VGR評論是正確的,但讓我詳細說明您的具體情況。 狗是動物,但動物不一定是狗。 您可以創建Dog對象,並將它們作為Animal對象傳遞,但不能相反。 解決此問題的常用方法如下:

public static void main(String args[]) {        
    Dog dog = new Dog();
    makeMeTalk(dog);
}

public static void makeMeTalk(Animal animal) {
    animal.talk();
}

其輸出為: Dog

暫無
暫無

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

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