主要討論的是非基本數據類型,即class類型之間的轉換。我們知道,子類向父類的轉換毫無疑問是可以順利完成的(因爲父類中的成員變量子類一定有)。但有時候爲了使用多態性,需要將父類對象的句柄強制轉換爲子類的對象(強制造型),由於子類的成員可能在父類中沒有,這時可能就會出現問題。
假設有以下兩個類father和kid:
class father{
int a;
public father(int k) { //構造函數
this.a=k;
}
}
class kid extends father{
int b;
public kid(int k) { //構造函數
super(k);
b=2*k;
}
public int getB() {
return this.b;
}
}
如果這樣對引用f1做類型轉換
public static void main(String[] args) {
father f1= new father(5);
kid k=(kid)f1;
System.out.println(k.getB());
}
編譯不會出問題而運行會拋出異常,提示father cannot be cast to kid。
但修改一下主函數部分的類型轉換方式:
public static void main(String[] args) {
kid k1=new kid(10);
father f1=(father)k1;
kid k=(kid)f1;
System.out.println(k.getB());
}
輸出結果
20
可見,變量f1本身就是子類的對象,由於一些原因暫時被轉換爲父類的對象引用了,但子類特有的數據部分並沒有丟失,因此重新轉換爲子類對象時,可以順利的訪問子類特有的函數和成員變量。而前一個程序中,只是單純想將父類對象轉換爲子類,顯然是不行的。而這個問題編譯時不會被發現。