2013-10-10 168 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 

如何能延长动物狗? 。它就像在说 - “每只动物都是狗”。这是错误的... 所以,它应该是相反的...

这个例子只会进一步迷惑你..

唐诺为什么没有人提出这...