1. 程式人生 > >Java中的向上轉型與向下轉型

Java中的向上轉型與向下轉型

    Java中的類的繼承關係中,有向上轉型與向下轉型兩種。

   當父類的引用指向子類物件時,稱為向上轉型。比如Father是父類,Son是子類,則Father father=new Son()這種就是向上轉型;這個時候執行的是指向的子類物件的方法。如下

public class Father {
    public void eat() {
        System.out.println("父類的吃方法");
    }
}
public class Son extends Father {
    public void eat() {
        System.out
.println("子類的吃方法"); } public static void main(String[] args) { Father father = new Son();//向上轉型 father.eat(); } }
輸出
子類的吃方法

這個時候把子類物件賦給父類引用變數,這很自然,兒子總是要升任為父親,這時候不需要強制型別轉換。父類引用可以指向子類物件。可記成父親可以指著兒子的鼻子教育。

        把父類的引用變數賦給子類引用時,稱為向下轉型。老爹要變成兒子,這個時候需要強制型別轉換。比如上面的Son 與Father,如果Son son=(Son )father;這個就是向下轉型。還有一種情況,比如Father father=new Father ();Son son=(Son )father;這種也是向下轉型,但是因為子類引用不能指向父類物件,可記成兒子不

可以指著父親的鼻子教育,所以會報ClassCastException的錯。還有,沒有繼承關係的兩個類之間,也會報ClassCastException的錯。比如Object obj=new Integer(2);Object是所有類的父類,實際的話執行的是Integer類的方法,現在是Integer型別,String s=(String)obj;這時把Integer型別強轉成String型別,這時候就會報ClassCastException的錯。在專案中,如果為了避免出現ClassCastException的情況,我們一般會先使用Instanceof 運算子來判斷是否可以成功轉換。這樣可以使程式更加的健壯。

如上兩個的例子,

public class Father {
    public void eat() {
        System.out.println("父類的吃方法");
    }
}
public class Son extends Father {
    public void eat() {
        System.out.println("子類的吃方法");
    }

    public static void main(String[] args) {
        Father father = new Father();//向下轉型
if (father instanceof Son) {
            Son son = (Son) father;
            son.eat();
        }
    }
}
Object obj = new Integer(2);
if (obj instanceof String) {
    String s = (String) obj;
}