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