JAVA學習筆記(強制類型轉換)

主要討論的是非基本數據類型,即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本身就是子類的對象,由於一些原因暫時被轉換爲父類的對象引用了,但子類特有的數據部分並沒有丟失,因此重新轉換爲子類對象時,可以順利的訪問子類特有的函數和成員變量。而前一個程序中,只是單純想將父類對象轉換爲子類,顯然是不行的。而這個問題編譯時不會被發現。

發佈了39 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章