Java 強制類型轉換(學習 Java 編程語言 044)

將一個類型強制轉換成另一個類型的過程被稱爲強制類型轉換。Java 程序設計語言提供了一種專門用於進行強制類型轉換的表示法。
double x = 3.405;
int nx = (int) x;
將表達式 x 的值轉換成整數類型,捨棄了小數部分。java

正像有時候須要將浮點數轉換成整數同樣,有時候也可能須要將某個類的對象引用轉換成另一個類的對象引用。要完成對象引用的強制類型轉換,轉換語法與數值表達式的強制類型轉換相似,僅須要用一對圓括號將目標類名括起來,並放置在須要轉換的對象引用以前就能夠了。數組

public class Manager extends Employee {
    ...
}
Employee[] staff = new Employee[3];
staff[0] = new Manager("Carl Cracker", 75000, 1987, 12, 15);
staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);

// 強制類型轉換
Manager boss = (Manager)staff[0];

進行強制類型轉換的惟一緣由是: 要在暫時忽視對象的實際類型以後使用對象的所有功能。例如,因爲某些元素是普通員工,因此 staff 數組必須是 Employee 對象的數組。咱們須要將數組中引用經理的元素復原成 Manage 對象,以便可以訪問新增長的全部變量。ide

在 Java中,每一個對象變量都有一個類型。類型描述了這個變量所引用的以及可以引用的對象類型。例如,staff[i] 引用了一個 Employee 對象(所以它還能夠引用 Manager 對象)。測試

將一個值存入變量時,編譯器將檢查你是否承諾過多。若是將一個子類的引用賦給一個超類變量,編譯器是容許的。但將一個超類的引用賦給一個子類變量時,就承諾過多了。必須進行強制類型轉換,這樣纔可以經過運行時的檢査。設計

若是試圖在繼承鏈上進行向下的強制類型轉換,而且 「謊報」 對象包含的內容,會發生什麼狀況呢?
Manager boss = (Manager) staff[1] ; // Error
運行這個程序時,Java 運行時系統將注意到你的承諾不符,併產生一個 ClassCastException 異常。若是沒有捕獲這個異常,那麼程序就會終止。所以,應該養成這樣一個良好的程序設計習慣:在進行類型轉換以前,先查看是否可以成功地轉換。爲此只須要使用 instanceof 操做符就能夠實現。例如:code

if(staff[1] instanceof Manager) {
    boss = (Manager) staff[1];
    ...
}

最後,若是這個類型轉換不可能成功,編譯器就不會讓你完成這個轉換。例如,下面這個強制類型轉換:
String c = (String) staff[1];
將會產生編譯錯誤,這是由於 String 不是 Employee 的子類。 對象

強制類型轉換注意事項:繼承

  • 只能在繼承層次內進行強制類型轉換。
  • 在將超類強制轉換成子類以前,應該使用 instanceof 進行檢查。

若是 x 爲 null,進行如下測試
x instanceof C
不會產生異常,只是返回 false。之因此這樣處理是由於 null 沒有引用任何對象,固然也不會引用 C 類型的對象。get

實際上,經過強制類型轉換來轉換對象的類型一般並非一種好的作法。在咱們的示例中,大多數狀況並不須要將 Employee 對象強制轉換成 Manager 對象,兩個類的對象都可以正確地調用 getSalary 方法,這是由於實現多態性的動態綁定機制可以自動地找到正確的方法。編譯器

只有在使用 Manager 中特有的方法時才須要進行類型轉換。若是出於某種緣由發現須要在 Employee 對象上調用 Manager 中特有的 setBonus 方法,那麼就應該自問超類的設計是否合理。可能須要從新設計超類,並添加 setBonus 方法,這纔是更合適的選擇。請記住,只要沒有捕獲 ClassCastException 異常,程序就會終止執行。 通常狀況下,最好儘可能少用強制類型轉換和 instanceof 運算符。

相關文章
相關標籤/搜索