天天看點

領略多态的魅力-對象向下轉型 | 帶你學《Java面向對象程式設計》之四十九

上一篇:領略多态的魅力-對象向上轉型 | 帶你學《Java面向對象程式設計》之四十八

【本節目标】

通過閱讀本節内容,你将完整了解面向對象多态性的各種實作模式,學會借助向上、向下轉型實作高效程式設計。

對象向下轉型

向下轉型的主要特點在于需要使用一些子類自己特殊的定義處理。

領略多态的魅力-對象向下轉型 | 帶你學《Java面向對象程式設計》之四十九

圖一 了解向下轉型

範例:實作向下轉型

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面向對象程式設計文章檢視此處