Java中父類與子類的轉換問題


先看個例子:

 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行代碼)

總結:

父類不能直接強轉成子類,除非父類是由該子類創建而來的!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM