JAVA向上轉型和向下轉型(二)
JAVA向下轉型是不安全的。為什麼呢?舉個例子。
定義父類:
public class Animal {
public void eat(){
System.out.println("吃飽了!");
}
}
子類:
public class Dog extends Animal {
public void run(){
System.out.println("跑起來!!");
}
}
public class Bird extends Animal {
public void fly(){
System.out.println("飛起來!!");
}
}
編寫以下程式碼,執行:
Animal a = new Animal();
Bird b = (Bird)a;//向下轉型
b.eat();
b.fly();
編譯沒有問題,執行報錯:Exception in thread "main" java.lang.ClassCastException: cn.xl.c3.Animal cannot be cast to cn.xl.c3.Bird
at cn.xl.c3.Test.main(Test.java:14)
結論:
-
向上轉型時,父類指向子類引用物件會遺失子類獨有的新函式,在編譯時,系統會提供找不到方法的錯誤。
-
向上轉型是安全的。
-
向下轉型的過程中是不安全的,編譯不會出錯,但是執行時會出現java.lang.ClassCastException錯誤。它可以instanceof來避免出錯此類錯誤。
JAVA虛擬機器呼叫一個類方法時,它會基於物件引用的型別(通常在編譯時可知)來選擇所呼叫的方法。相反,當虛擬機器呼叫一個例項方法時,它會基於物件實際的型別(只能在執行時得知)來選擇所呼叫的方法,這就是動態繫結,是多型的一種。動態繫結為解決實際的業務問題提供了很大的靈活性,是一種非常優美的機制。——《JAVA動態繫結的內部實現機制》,作者 飛天金剛 。
由此可見,向下轉型時,編譯通過,但是執行的過程中虛擬機器需要呼叫引用指向的例項方法,這時就會出現問題。
向上轉型既然不安全是不是就沒有用了,答案是否定的。詳情參加《JAVA向上轉型和向下轉型(三)》
相關文章
- java多型-向上轉型和向下轉型Java多型
- JAVA向上轉型和向下轉型(一)Java
- Java 向下和向上轉型Java
- 多型,向上向下轉型多型
- C++中的向上型別轉換和向下型別轉換C++型別
- java型別轉換與強制型別轉換(轉)Java型別
- java轉型問題Java
- java之物件轉型Java物件
- scala和java資料型別轉換Java資料型別
- 從Java的型別轉換看MySQL和Oracle中的隱式轉換(二)Java型別MySqlOracle
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- java之物件轉型2Java物件
- JAVA 字元轉浮點型Java字元
- Java 範型攻略篇(轉)Java
- Java資料型別及型別轉換Java資料型別
- Scrum轉型(二) Scrum的角色Scrum
- 向上向下傳遞資料
- Java入門系列-05-資料型別和型別轉換Java資料型別
- 【Java】資料型別轉換Java資料型別
- java中的型別轉換Java型別
- java基本型別和物件之間的轉換Java型別物件
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- 第11章 使用類——型別轉換(二)將自定義型別轉換為內建型別型別
- 多型中的轉型多型
- Java中String和byte型別互相轉換Java型別
- JAVA多型性<==>我和網友交流實錄 (轉)Java多型
- 2、java資料型別轉換Java資料型別
- java基礎:型別轉換castJava型別AST
- java簡單資料型別(轉)Java資料型別
- JAVA型別轉換怎麼變Java型別
- 物件轉型物件
- C#變數型別(1):引用型別和值型別 (轉)變數型別
- Java基礎知識-基本資料型別相互轉型Java資料型別
- 自學java筆記I 基本型別+轉義字元+資料型別的轉換Java筆記字元資料型別
- PHP 型別轉換&&型別強制轉換PHP型別
- JAVA基礎:Java變數型別間的相互轉換(轉)Java變數型別
- Java學習--Java 中基本型別和字串之間的轉換Java型別字串
- ORACLE DATE和TIMESTAMP資料型別的比較(二) (轉)Oracle資料型別