2014-03-05 43 views
1

我有這樣的代碼。將超類的對象轉換爲子類

超級類

public class Actual { 
    public int x = 123; 
} 

子類

public class Super extends Actual{ 
    public int x = 999; 
    public int y = 12345; 
} 


public class Sub extends Super { 
    public int x = 144; 
} 

所以問題是我能轉換超類對象到子類? 這是正確的這個問題我試過了嗎?

public class Mid1Prob1 { 
    public static void main(String[] args) { 
     System.out.println("Testing..."); 
     int x = 3; 
     Actual actual = new Super(); 
     System.out.println(actual.x); 


     Super super1 = new Super(); 
     System.out.println(super1.x); 


     Actual act = new Actual(); 

     act = new Sub(); 
     System.out.println(act.x); 
    } 
} 

但它賦予Class Cast異常。

+1

發佈異常跟蹤 –

+4

您提供的代碼段不會拋出ClassCastException。 – Radiodef

+0

你的代碼中沒有任何地方是你將一個超類轉換爲子類。你在哪裏得到ClassCastException? – TheLostMind

回答

4

您可以將Child類轉換爲Super類,但反之亦然。 如果汽車是超級汽車,汽車是子類,那麼所有汽車(兒童)都是汽車(超級),但並非所有汽車都是汽車。

+0

+1完美ANS花花公子:) – Krishna

+0

@Krishna歡迎:) –

+0

:)我蓋爾德有ANS – Krishna

2

有沒有可能做到這一點。你只能這樣。 Actual s = new Super();Super sp = new Super();Actual a = new Actual();沒有其他的可能性。只有那個assigment可能不會拋出classcast Exception。

+0

如何'超級S =新的實際();'是可能的? –

+0

誤解。我做了改變。 – RMachnik

+0

你試過嗎? –

2

我可以轉換成超類對象到子類?

沒有,你只能做它的其他方式。您只能將子類對象分配給超類參考。

原因是,子類可以有更多的功能和更具體的問題。如果您允許將超類對象提交給子類,那麼該超類對象將如何獲得這些子類功能?

+1

+1更接近ans。:) – Krishna

1

這些都是創建超類和子類的對象的唯一方法:

Actual act = new Actual(); 
Actual actual = new Super(); 
Actual actual2 = new Sub(); 

Super super1 = new Super(); 
Super super2 = new Sub(); 

Sub sub = new Sub(); 

有沒有其他辦法。如果你嘗試過,它會給你編譯時間錯誤,以鑄造你的課程或給運行時間錯誤java.lang.ClassCastException

+0

如果你能創建實際的超級類對象,你將能夠通過這個實際的對象訪問超類的int? – Krishna

+0

任何方式+1爲你的答案哥們。 – Krishna

+0

可能這個鏈接將有助於理解,http://www.xyzws.com/Javafaq/what-is-variable-hiding-and-shadowing/15 –