java中的类转换

java中的类转换,java,casting,Java,Casting,在我的代码中有两个类,子类扩展了超类。在子类中,我重写了超类方法。在创建对象时,我创建了子类对象的超类引用,它工作正常。但我再次将超类引用转换为完整的超类对象,但它调用子类methodn而不是超类方法。我的假设输出是错误的。这是我的代码 public class OverRiding { public static void main(String[] args) { // TODO Auto-generated method stub //Super

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

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

这里的
d
不是纯粹的
Dog
对象。它仍然是
动物类型。纯
Dog
对象将通过
Dog d=newdog()
创建

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

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

   Dog dog = new Animal();
    //Completely converted into pure Dog class Object
    Dog d = (Dog) dog;
Dog
d
都指向同一个引用,因为您没有创建新的
对象。施法在这里没有效果


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

你的假设是错误的:

完全转换为纯狗类对象

当您将
动物
抛给
时,变量d仍然是
动物
。它也是一种
,但最具体的类型是
动物

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

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

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

你的想法不正确,兄弟

 class Animal extends Dog
动物如何能延长狗的寿命。这就像一句谚语:“每种动物都是狗”。这是错误的。。。 所以,应该是另一种方式

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


Donno为什么没人提起这个…

压痕是你最好的朋友。
类动物扩展狗
?嗯,我认为动物不应该延伸到狗,因为每种动物都不是狗。应该是另一种方式:狗应该延伸动物,因为狗是一种动物。投射永远不会改变对象的类型。它只允许获取对对象的更特定类型的引用。动物永远都是动物,不管你想把它扔给谁。扔不是转化!
 class Animal extends Dog