[英]ClassCastException when casting a base class object to an class that extends base class
我已經在代碼行中提到了我想理解的注釋 ,如下所示:
我不明白這行代碼:Xyz obj3 Xyz obj3=(Xyz) obj1;
Abc
不能Xyz
為Xyz
類型。 已編譯,但在執行過程中返回異常: Xyz obj2=(Xyz)new Abc();
class Abc { Abc() { System.out.println(" Hello "); } void show() { System.out.println("Conco constructor w/ Super Class"); } } class Xyz extends Abc { Xyz() { System.out.println(" Hi "); } void display() { System.out.println("ConsNew3 constructor w/ Extends Class Conco"); } public static void main(String arg[]) { Xyz obj=new Xyz(); Abc obj1=new Xyz(); obj1.show(); Xyz obj3=(Xyz) obj1; // I didnt't understand this line of code /*Xyz obj2=(Xyz)new Abc(); Abc cannot be cast to Xyz type . Compiled , but returns exception during execution */ } }
一般而言,盡管程序要求,人類的抽象符號表示不是很好。
編程的初學者(更正確地說是任何人)都不應使用Abc和Xyz等抽象名稱,這甚至會使高級程序員感到困惑。
為什么不將Abc重命名為Animal,將Xyz重命名為Dog。
然后您有:
Dog obj3=(Dog) obj1; // works because Dog is an Animal.
Dog obj2=(Dog) new Animal(); // does not compile because not all Animals are Dogs
Xyz obj3=(Xyz) obj1;
這行有效,因為Xyz
是Abc
。
Xyz obj2=(Xyz)new Abc();
這行不起作用,因為並非所有Abc
都是Xyz
。
正如評論所提到的,用這種方式命名事物可能更有意義。
Abc ==動物
Xyz ==狗
Dog obj3 = (Dog) obj1;
obj1
以前被實例化為Dog
盡管它由更通用的Animal
對象持有。 它仍然是Dog
一個實例,因此可以將其轉換回Dog
。
Dog obj2 = (Dog) new Animal();
Animal
不一定是Dog
。
為了避免出現此類問題,您可以使用instanceof
運算符。 這將測試通用對象是否是另一個(通常是更特定的)對象的實例。
您可以如下使用。
Object myGenericDog = new Dog();
Animal myAnimal = new Animal();
if(myGenericDog instanceof Animal){
myAnimal = (Animal) myGenericDog;
}
供將來參考,在真實代碼和示例代碼的情況下,這對開發人員編寫代碼以及將來可能最終維護代碼以使用描述性類名的任何將來的開發人員都有利。 注意: Xyz
和Abc
不是描述性的 。 它們引入了不必要的復雜性。 您可以通過選擇名詞和描述類責任的名稱來改進自己的代碼和示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.