2014-02-22 53 views
0

如果子類屬於相同的層次結構,我們是否可以向下投射超類?scjp:類鑄造規則集

例如:這裏

class Building { } 
public class Barn extends Building { 
public static void main(String[] args) { 
Building build1 = new Building(); 
Barn barn1 = new Barn(); 
//Barn barn2 = (Barn) build1; // line number 10 
Object obj1 = (Object) build1; 
//String str1 = (String) build1; // line number 12 
Building build2 = (Building) barn1; 
} 
} 

回答說只有12行註釋將使代碼編譯。但是,即使第10行被註釋了,代碼也只能被編譯。請幫忙。

+1

爲什麼會註釋行'10'使代碼編譯失敗? –

+0

除了@RohitJain說你在第10行鑄造完全沒問題。 –

+0

檢查http://stackoverflow.com/questions/4862960/explicit-casting-from-super-class-to-subclass – Rohan

回答

0

由於Building不是從Barn派生的,您將收到ClassCastException。這個例外是可能的,你可以在任何時候執行一個未經檢查的downcast。

由於Barn延伸Building您需要將Barn的實例分配到build1

Building build1 = new Barn(); 
Barn barn2 = (Barn) build1; 

由於文檔解釋了一個類轉換異常被拋出:

拋出,表明代碼試圖將對象強制轉換爲 子類,它是不是一個實例。

僅僅因爲兩個類是在同一類層次結構並不意味着我們可以自由向下轉換爲任何類型的層次結構。我們向下轉換的實例必須是我們向下轉換的類型。由於實例創建的類型爲Building,它在類型層次結構中設置了高於Barn的一個級別,因此無法將其轉換爲Barn

+0

是的......但在一些網站上,人們正在解釋說,如果屬於相同的等級。這是可能的...如果是這樣,你可以請求擴展... – user3066920

+0

@ user3066920是的,這是完全可能的,但是一個向下轉換,將一個超類的實例投射到一個子類。如果實例是子類型的** NOT **,那麼這是非法的。 –

0

請看下面的例子

class SuperClass { 
... 
} 

class SubClass extends SuperClass { 
... 

} 

public class Program { 
    public static void main(String[] args) { 

// case 1: actual SuperClass object 
    SuperClass p1 = new SuperClass(); 

// case 2: SubClass object is referred by a SuperClass reference 
    SuperClass p2 = new SubClass(); 

    SubClass s1 = (SubClass)p1; //run time error 
    SubClass s2 = (SubClass)p2; //OK 
    } 
} 

謝謝你好運

+0

感謝您的支持 – user3066920

+0

歡迎您---> user3066920 – T8Z