0

在我的代码中有两个类,子类扩展了超类。在子类中我覆盖了超类方法。在创建对象时,我创建了对子类对象的超类引用,它工作正常。但是我再次将超类引用转换为完整的超类对象,但它调用子类方法而不是超类方法。我的假设输出是错误的。这是我的代码

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
4

5 回答 5

5

你这个概念不对啊兄弟……

 class Animal extends Dog

Animal如何扩展狗?. 就像在说——“每只动物都是狗”。这是错误的......所以,它应该是相反的......

这个例子只会让你更加困惑..

不知道为什么没有人提出这个...

于 2013-10-10T09:22:57.180 回答
3
 Dog d = (Dog) dog;

这里d不是纯粹的Dog对象。它仍然是Animal类型。纯Dog对象将通过Dog d = new Dog().

于 2013-10-10T08:50:35.673 回答
2
   Dog dog = new Animal();
    //Completely converted into pure Dog class Object
    Dog d = (Dog) dog;

两者Dogd 都指向同一个引用,因为您没有创建 object的. Cast 在这里不会有效果。

铸造和创造是完全不同的。

于 2013-10-10T08:52:40.697 回答
1

在这个例子中,你只创建了一个对象,它是一个Animal, (遗憾的是,它是 的一种特殊类型Dog)。当你调用eat这个对象时,你总是会得到类中定义的Animal版本,而不是类中定义的版本Dog

这就是多态性。被调用的方法的版本取决于对象的类,而不是引用它的变量的类型。

于 2013-10-10T08:51:44.580 回答
1

你的假设是错误的:

完全转化为纯Dog类Object

当您将您的转换Animal为 aDog时,您的变量 d 仍然是 a Animal。它也是一个Dog,但最具体的类型是Animal

您没有将变量完全转换为另一个实例。您的实例仍然相同。

为了证明,您可以尝试以下代码:

Dog d = (Dog) dog;
d.getClass(); // output Animal
于 2013-10-10T08:53:21.233 回答