先看個例子:
1 class A { 2 public A() { 3 } 4 } 5 6 class B extends A { 7 public B() { 8 super(); 9 } 10 }
上面定義了兩個類,一個是類A,一個是由A派生而來的類B
再看主函數的代碼:
public class TestDemo { public static void main(String[] args) { B b = new B(); A a = new A(); a = b; } }
這個不報錯,也符合我們的邏輯,子類賦值給父類,就好比蘋果(子類)是水果(父類)一樣。
接下來才是重點:
public class TestDemo { public static void main(String[] args) { B b = new B(); A a = new A(); b=(B) a; } }
這段代碼在編譯時期不會出錯,但運行時期卻報錯了:
Exception in thread "main" java.lang.ClassCastException: com.laowu.A cannot be cast to com.laowu.B
報錯說:A類不能轉換成B,為什么?其實“單純的”父類是不能強轉成子類的,這就好比:水果(父類)是蘋果(子類)一樣,不合邏輯。
但是下面這段代碼編譯和運行都不會出錯:
1 public class TestDemo { 2 3 public static void main(String[] args) { 4 B b = new B(); 5 A a = new B(); 6 b = (B) a; 7 } 8 9 }
這段代碼也是我初學時很納悶的地方,但仔細想想就理解了,先看第5行代碼,父類A由子類B創建的,之后第6行代碼,子類對象b由父類a對象強制轉換而來,這個就不是“單純的”父類了,因為它和子類已經構建了聯系
這就好比,首先說明了這個水果是蘋果(構建了聯系,第5行代碼),之后說的這個水果,它就是蘋果(第6行代碼)