2013-10-10 87 views
1

在我的代碼中有兩個類,子類擴展超類。在子類中,我重寫了超類方法。在創建對象時,我創建了超類對子類對象的引用,它的工作正常。但是,我再次將超類引用轉換爲完整的超類對象,但它調用子類methodn而不是超類方法。我的假設輸出wrong.Here我的代碼java中的類鑄造

public class OverRiding { 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     //Super class reference to sub class Object 
     Dog dog = new Animal(); 
     dog.eat(); 
     dog.bow(); 

     //Completely converted into pure Dog class Object 
     Dog d = (Dog) dog; 
     d.eat(); 
     d.bow(); 
    } 
} 

狗類

class Dog { 
    public void eat() { 
     System.out.println("Dog eat Biscuits"); 
    } 

    public void bow() { 
     System.out.println("Dog bow"); 
    } 
} 

類動物

class Animal extends Dog { 
    public void eat() { 
     System.out.println("Animal eat Food"); 
    } 
} 

而且我的輸出是

Animal eat Food 
Dog bow 
Animal eat Food 
Dog bow 
+2

縮進是你最好的朋友。 – Maroun

+6

'類動物延伸狗'?嗯我想反之亦然 –

+3

動物不應該延長狗,因爲每個動物不是狗。它應該是另一種方式:狗應該擴展動物,因爲狗*是動物。 –

回答

3
Dog d = (Dog) dog; 

這裏d不是純粹的Dog對象。它仍然是Animal類型。純Dog對象將通過Dog d = new Dog()創建。

1

在這個例子中,你只創建了一個對象,它是一個Animal,(不幸的是,它是一種特殊類型的Dog)。當您在此對象上調用eat時,您總是會獲得Animal類中定義的版本,而不是Dog類中定義的版本。

這是多態性。被調用的方法的版本取決於對象的類,而不是引用它的變量的類型。

2
Dog dog = new Animal(); 
    //Completely converted into pure Dog class Object 
    Dog d = (Dog) dog; 

兩個Dogd都指向同一個參考,因爲你沒有創建一個新object。演員在這裏沒有效果。

鑄造和創造是完全不同的。

1

你的假設是錯誤的:

完全轉化成純狗類對象

當你您鑄造AnimalDog,你的變量d仍是一個Animal。這也是Dog,但最具體的類型是Animal

您並未將您的變量完全轉換爲另一個實例。你的實例仍然是一樣的。

對於一個證明,你可以試試這個代碼:

Dog d = (Dog) dog; 
d.getClass(); // output Animal 
5

你的觀念是不正確的兄弟......

class Animal extends Dog 

如何能延長動物狗? 。它就像在說 - 「每隻動物都是狗」。這是錯誤的... 所以,它應該是相反的...

這個例子只會進一步迷惑你..

唐諾爲什麼沒有人提出這...