天天看點

危險的轉型操作 | 帶你學《Java面向對象程式設計》之六十三

上一篇:掌握接口,從這三則案例開始! | 帶你學《Java面向對象程式設計》之六十二

【本節目标】

通過閱讀本節内容,你将複習一次關于向上、向下轉型的實作方法,并意識到轉型過程中可能會發生的風險。

泛型是從JDK1.5之後追加到Java語言裡面的,其主要目的是為了解決ClassCastException的問題,在進行對象的向下轉型時永遠都可能存在有安全隐患,而Java希望通過泛型可以慢慢解決掉此類問題。

泛型的問題引出

現在假設定義一個描述x與y坐标的處理類,并且在這個類之中允許開發者儲存三類資料:

  • 整型資料:x = 10、y = 10 ;
  • 浮點型資料: x = 10.1、y = 20.9 ;
  • 字元串型資料: x = 東經120度、北緯30度;
class Point {
    private x ;
    private y ;
}           

于是在設計Point類的時候就需要去考慮具體的x和y屬性的類型,這個類型要求可以儲存以上三種資料,很明顯,最為原始的做法就是利用Object類來進行定義,因為存在有如下的轉型關系:

  • 整型資料:基本資料類型→包裝為Integer類對象→自動向上轉型為Object;
  • 浮點型資料:基本資料類型→包裝為Double類對象→自動向上轉型為Object
  • 字元串型資料:String類對象→自動向上轉型為Object

範例:定義Point類如下

class Point {
    private Object x ;
    private Object y ;
    public void setX(Object x) {
        this.x = x ;    
    }
    public void setY(Object y) {
        this.y = y ;
    }
    public Object getX() {
        return this.x ;
    }
    public Object getY() {
       return this.y ;
    }
}           

而後下面進行内容的設定。

範例:進行正确的内容操作

class Point {
    private Object x ;
    private Object y ;
    public void setX(Object x) {
        this.x = x ;    
    }
    public void setY(Object y) {
        this.y = y ;
   }
   public Object getX() {
       return this.x ;
   }
   public Object getY() {
       return this.y ;
   }
}
public class JavaDemo {
    public static void main(String args[]) {
        Point point = new Point() ;
    //第一步:根據需求進行内容的設定
        point.setX(10) ;    //自動裝箱
        point.setY(20) ;    //自動裝箱
    //第二步:從裡面擷取資料
        int x = (Integer) point.getX() ;
        int y = (Integer) point.getY() ;
        System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
    }  //執行結果:x坐标:10、y坐标:20
}           

本程式之是以可以解決目前的設計問題,主要的原因在于,Object可以接收所有資料類型,但是正因為如此,是以本代碼也會出現有嚴重的安全隐患。

範例:觀察錯誤

public class JavaDemo {
    public static void main(String args[]) {
        Point point = new Point() ;
    //第一步:根據需求進行内容的設定
        point.setX(10) ;    //自動裝箱
        point.setY(“北緯20度”) ;    //自動裝箱
    //第二步:從裡面擷取資料
        int x = (Integer) point.getX() ;
        int y = (Integer) point.getY() ;
        System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
    }  
}           

此時的程式明顯出現了問題,如果在程式編譯的時候,實際上是不會有任何錯誤産生的,而程式執行的時候就會出現“ClassCastException”異常類型,是以本程式的設計是存在有安全隐患的。而這個安全隐患存在的依據在于使用了Object類型,因為Object可以涵蓋的範圍太廣了,而對于這樣的錯誤如果可以直接出現在編譯的過程之中,那麼就可以避免運作時的尴尬。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:泛型帶你規避風險 | 帶你學《Java面向對象程式設計》之六十四 更多Java面向對象程式設計文章檢視此處