Java中的向上轉型與向下轉型
阿新 • • 發佈:2019-01-24
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;
}