2014-06-14 212 views
0
class Home{ 
     void provideshelter(){ 
      //code 
     } 
     void Acessroom(){ 
      //code 
     } 
} 
class KangVilla extends Home{ 
     void AutomaticGates(){ 
      //code 
     } 
     //now KangVilla have more methods than Home,clearly. 
     public static void main(String[] args){ 
      Home H = new KangVilla(); 
      KangVilla k = (KangVilla) H;// i am having problem with these statements 
     } 
} 

問題我已閱讀,在編譯時,編譯器會當我說Home H檢查引用變量而不是實際的object.So這意味着編譯想過^h沒有KangVilla這是原始one.And它關心只方法,其是可訪問通Home類型的參考H並且這些在這種情況下,ok.But它允許的下一個語句是如何將基類型對象分配給父類型引用?

KangVilla k = (KangVilla) H; 

現在,這是一個簡單的邏輯k可以訪問比H多種方法,因爲它是派生的類的type.So爲什麼編譯器不complaning的基礎是,如果H轉換爲k然後(未失去在此轉換「H」上)有可能通過k訪問更多方法(Home +本地KangVilla),這些方法不可能通過H訪問?

那麼編譯器如何在不看到實際對象的情況下只看到引用變量來評估這一點?

+0

如果轉換無效,您將在運行時收到異常。 –

+0

@OliCharlesworth我在問編譯器如何驗證? – YakRangi

+0

它沒有。運行時確實。 –

回答

1

編譯器不會抱怨,因爲他無法評估該語句在設計時間期間是否非法。這取決於實際類型的h

如果你想它在運行時會工作使用這樣的:

Home h = new KangVanilla(); //this is legal 
    ... //other code 
    KangVilla k = (KangVilla) h; //so this IS legal. 
    k.AutomaticGates(); 

但是,這將引發一個演員的異常:

Home h = new Home(); //this is legal 
KangVilla k = (KangVilla) h; //but this isn't. 
k.Autom aticGates(); 

真實類型差異即時通訊談論關於:

Home h = new Home(); 
System.out.println(h instanceof Home); //true; 
System.out.println(h instanceof KangVanilla); //false; 


Home h = new KangVanilla(); //this is a REAL KangVanilla, Casted up to Home. 
System.out.println(h instanceof Home); //true; 
System.out.println(h instanceof KangVanilla); //true - so THIS can be casted DOWN to a KangVanilla; 
+0

所以鑄造的合法性是在運行時檢查的,但爲什麼它不包含在編譯時,我的意思是編譯器知道哪個類是從哪個類繼承的,爲什麼它不能檢查'KangVilla k =(KangVilla )h;'在編譯時它有什麼好處,讓它直到運行時? – YakRangi

+0

@Bayant_singh始終允許上傳。但是,除非 - 如示例所示 - * real *類型與Cast-Target-Type匹配,否則不能向下投下。由於編譯器無法知道,如果'Home h'持有'Home'或'KangVanilla'這個延伸到家的地方,他肯定無法渲染DownCast。如果它是一個「家」 - 它會失敗。但是,如果它是'KangVanialla'剛剛上升到'家庭'它的工作。 Upcosting不會從實例中刪除信息。因此,Downcast可能再次成爲可能。 – dognose

+0

由**真正的**類型你的意思類型的實際對象? – YakRangi

相關問題