Object o = "hello";
String s = (String)o;
上面的代碼在編譯時和運行時都是正確的。
Object o = new Integer(5);
String s = (String)o;
上面的代碼能編譯通過,但運行時出拋出異常。
我們來分析錯誤的代碼,o編譯時的類型是Object,所以在(String)o強制轉換時編譯器並不會報錯,但是o的實際類型是Integer,在運行時就會有ClassCastException異常。較好的做法是在強制轉換前採用 instanceof運算符進行判斷。
類似的,我們在學習Java多態時一個原則“不能調用父類裏沒有的方法”。那究竟是爲什麼呢?比如,
class Base{
public void f() {System.out.println("father");}
}
public class Sub{
public void f() {System.out.println("son");}
public void g(){}
public static void main(String[] args){
Base b = new Sub();
b.f();
b.g();
}
上面的代碼是無法編譯通過的。本質的原因是 b在編譯時是Base類型,自然訪問不到g(),除非利用反射機制。