你真的理解運行時和編譯時類型的差別嗎?

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(),除非利用反射機制。


發佈了26 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章