在Java中由於繼承和向上轉型,子類可以非常自然地轉換成父類,但是父類轉換成子類則需要強制轉換。因爲子類擁有比父類更多的屬性、更強的功能,所以父類轉換爲子類需要強制。
Object x = new Integer(0);
Number y = (Number)x; //正確
父類引用x指向子類對象,多態。
x在內存中的本質還是Integer類型,所以可以強轉。
Integer x = new Integer(0);
String y = (String)x; //編譯時報錯,不兼容的類型
Object x = new Object();
Number y = (Number)x; //運行時拋出ClassCastException異常
編譯器在編譯時只會檢查類型之間是否存在繼承關係,有則通過;而在運行時就會檢查它的真實類型,是則通過,否則拋出ClassCastException異常。