2012-06-13 90 views
0

我是新來的java和我在鑄造上有一些問題。 我有一個名爲Parent的類,以及一個名爲Children的類,Children類是Parent的子類。關於在java中鑄造問題

public class Parent 
{ 
    int age; 
    String occupation; 

    public void print() 
    { 
     System.out.println("My age is:"+ age + "and i am a:" + occupation); 
    } 
} 



public class Children extends Parent 
{ 
    int height; 

    public static void main(String args[]) 
    { 
     Children c = new Children(); 
     Parent p = new Parent(); 

     p=c; 
     c=(Children) p; 

     /**Here***/ 



    } 

} 

我的問題是,當我在鑄造後添加p.XXX時,我只能看到例如p的年齡和職業。當我做c.xxx時,我可以看到所有的年齡,職業和身高。 我以爲當我做p = c時,p現在被認爲是兒童課的一個實例,不是嗎?如果是,那麼爲什麼我沒有看到高度整數可訪問? 當我做c =(Children)p時,一個Parent類的實例被分配給一個Children類的實例,並且由於Parent實例沒有選項,所以我們爲什麼要從父類轉換爲子類, ?

回答

7

我以爲當我做p = c時,p現在被認爲是兒童班的一個實例,不是嗎?

號變量p類型仍然是Parent將是對Children實例的引用,但編譯器不考慮這一點。它只使用變量的聲明類型。

當我做c=(Children)pParent類的實例分配給Children類的實例,而且由於Parent實例沒有一個選擇,那爲什麼我們做一個鑄件從父母到孩子,正確的?

那麼你根本沒有改變實例。您正在投射類型Parent的表達式 - 該值將成爲參考。在執行時,JVM將確保該值實際上是對Children或某個子類型(或null)實例的引用 - 如果不是,則JVM將引發異常。

區分變量,引用和對象是非常重要的 - 它們是三個完全不同的概念,並且確保你理解它們之間的差異會使其他事情變得更加清晰。

+0

那麼p = c的用法是什麼? –

+2

@qwrqwr:它將'p'的值設置爲與'c'的值相同(在那個時間點)。就是這樣。 –

+0

只是一個運行時操作,它會檢查鑄造對象是否可以視爲所請求類型的對象。對象本身保持不變。在你的情況下,c =(Child)p只有在p的實例實際上是Child或某個子類的實例時纔有效。 它被稱爲賦值兼容性,可以在運行時(通過「instanceof」運算符或Class.isAssignableFrom()方法執行此類轉換之前)進行檢查。 – Matt