【本節目标】
通過閱讀本節内容,你将完整了解面向對象多态性的各種實作模式,學會借助向上、向下轉型實作高效程式設計。
對象向下轉型
向下轉型的主要特點在于需要使用一些子類自己特殊的定義處理。

圖一 了解向下轉型
範例:實作向下轉型
class Person {
public void print() {
System.out.println(“一個正常的人類行為,吃飯、睡覺、繁衍。”) ;
}
}
class SuperMan extends Person {
public String fly () {
return “我可以飛。。。”;
}
public String fire () {
return “我可以噴火。。。” ;
}
}
public class JavaDemo{
public static void main(String args[]) {
System.out.println(“--------------正常狀态下的超人應該是一個普通人的狀态---------------”) ;
Person per = new SuperMan() ; //向上轉型
per.print();
System.out.println(“--------------外星怪獸狗騷擾地球,準備消滅人類 ---------------”) ;
SuperMan man = (SuperMan) per ; //向下轉型
System.out.println(man.fly()) ;
System.out.println(man.fire()) ;
}
}
向上描述的是一些公共的特征,而向下描述的是子類自己特殊的定義環境。但是需要明确的是,向下轉型并不是一件安全的事情。因為在進行向下轉型之前一定要首先發生向上轉型。
範例:觀察錯誤的程式
public class JavaDemo{
public static void main(String args[]) {
System.out.println(“--------------正常狀态下的超人應該是一個普通人的狀态---------------”) ;
Person per = new Person () ; //不轉型
per.print();
System.out.println(“--------------外星怪獸狗騷擾地球,準備消滅人類 ---------------”) ;
SuperMan man = (SuperMan) per ; //SuperMan類與Person類
}
}
執行結果:
Exception in thread “main” java.lang.ClassCastException:Person cannot be cast to SuperMan at JavaDemo.main
以後隻要是發生對象的向下轉型之前一定要首先向上轉型,兩個沒有任何關系的執行個體如果要發生強制轉換,就會出現“ClassCastException”異常,是以向下轉型并不是一件安全的事情。
instanceof關鍵字
通過分析可以發現,向下轉型本身是一件存在有安全隐患的操作,是以為了保證向下轉型的正确性,往往需要在進行轉型之前進行判斷,判斷某個執行個體是否是某個類的對象。這個就需要通過instanceof文法來實作。文法如下:
對象 instanceof 類
該判斷将傳回一個boolean類型,如果是true表示執行個體是指定類對象。
範例:觀察instanceof的使用
public class JavaDemo{
public static void main(String args[]) {
Person per = new Person () ; //不轉型
System.out.println(per instanceof Person) ; //true
System.out.println(per instanceof SuperMan) ; //false
}
}
範例:觀察instanceof關鍵字
public class JavaDemo{
public static void main(String args[]) {
Person per = new SuperMan () ; //向上轉型
System.out.println(per instanceof Person) ; //true
System.out.println(per instanceof SuperMan) ; //true
}
}
是以在日後進行項目的開發過程之中,如果要執行對象的向下轉型,最好先判斷一次。
class Person {
public void print() {
System.out.println(“一個正常的人類行為,吃飯、睡覺、繁衍。”) ;
}
}
class SuperMan extends Person {
public String fly () {
return “我可以飛。。。”;
}
public String fire () {
return “我可以噴火。。。” ;
}
}
public class JavaDemo{
public static void main(String args[]) {
Person per = new SuperMan () ; //向上轉型
if (per instanceof SuperMan) {
SuperMan man = (SuperMan) per ;
System.out.println(man.fly()) ;
System.out.println(man.fire()) ;
}
}
}
在以後進行一些完善性的程式開發的過程之中,對于轉型之前一定要使用instanceof判斷。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:萬類之祖-Object簡介 | 帶你學《Java面向對象程式設計》之五十 更多Java面向對象程式設計文章檢視此處