2014-03-06 52 views
1

當子類的對象被分配到一個超類的變量,爲什麼只有這些成員 是其超類ClassCastException異常,請幫助我真正的概念

class A { 
    int i=10; 
    void adsip() { 
     System.out.println(i); 
    } 
} 

class B extends A { 
    int j=20; 
    void bdsip() { 
     System.out.println(i+j); 
    } 
} 

class inherit4 { 
    public static void main(String[] x) { 
     A a=new A(); 
     B b=new B(); 
     System.out.println("b.i="+b.i+"b.j="+b.j); 
     b.adsip(); 
     b.bdsip(); 
     a=b; 
     System.out.println("a.i="+a.i); 
     a.adsip(); 
    } 
} 

上面的代碼定義工作正常訪問 但添加aj和a.bdisp()後;生成錯誤,據我所知在上面代碼中的& b代表 參考A類對象的內存分配B爲什麼代碼不能訪問a.j和a.bdsip();在上面的代碼中。

回答

1

爲什麼只有那些成員是其由超類

限定,因爲,在運行時,超類參考可能指向任何類的超類的實例或實例訪問在子類層次結構中。

超類具有方法m1,但子類具有方法m1和m2。你想使用超類的引用訪問m2。但是如果在運行時引用指向超類的實例(不包含m2)呢?

所以最終結果是 - 在運行時,保證可以使用超類引用訪問的唯一成員是在超類中定義的成員。

1

ClassCastException - 拋出以指示代碼嘗試將對象轉換爲不是實例的子類。

例如,下面的代碼生成一個ClassCastException:

Object x = new Integer(0); 
System.out.println((String)x); 

另外請參閱該線程。 Can someone explain 「ClassCastException」 in Java?

1

在繼承中,子可以訪問父數據,但反過來是不可能的。父母不能訪問子數據。因此,這裏的類A的對象,a不能訪問B類的方法或數據。

+1

你說你父親可以訪問子數據,但反過來是不可能的。但A是父母。它不能訪問B類的方法。請澄清。 – RuntimeException

+2

*在繼承父母可以訪問子數據,但相反是不可能的*你錯了。子類可以訪問父類中的'protected'和'public'數據(如果子類與父類位於同一個包中,它也可以訪問「默認」數據),但父類不知道具體的具體情況數據在兒童班... –

+0

對不起我的錯!我打錯了。抱歉的問題.... – Anita