对象和转换java

对象和转换java,java,object,casting,extend,Java,Object,Casting,Extend,我的家庭作业是这样的 哺乳动物宠物=新狗() 萨摩耶s=宠物 我们得到了这样一张图: 动物--->脊椎动物--->哺乳动物--->狗--->哈士奇、萨莫耶德、小猎犬 我的理解是代码无效,无法强制转换。“哺乳动物”是指狗的对象,Samoyed类型不在“狗”或“哺乳动物”中 正确吗?这不是有效的强制转换,因为它试图将Dog的实例分配给声明为typeSamoyed的变量。你的假设是正确的 您可以在父对象中放置子引用,但反向不正确。第一种说法是有效的,因为狗是哺乳动物的后代。但第二个语句是不正确的,因为

我的家庭作业是这样的

哺乳动物宠物=新狗()

萨摩耶s=宠物

我们得到了这样一张图:

动物--->脊椎动物--->哺乳动物--->狗--->哈士奇、萨莫耶德、小猎犬

我的理解是代码无效,无法强制转换。“哺乳动物”是指狗的对象,Samoyed类型不在“狗”或“哺乳动物”中


正确吗?

这不是有效的强制转换,因为它试图将
Dog
的实例分配给声明为type
Samoyed
的变量。你的假设是正确的

您可以在父对象中放置子引用,但反向不正确。第一种说法是有效的,因为狗是哺乳动物的后代。但第二个语句是不正确的,因为您试图将哺乳动物的父对象转换为其子引用Samoyed

基本上,JVM使用父对象的概念来保存多态性的任何子引用。想象一个场景,你必须设计一种可以接受任何动物输入的方法。您可以简单地编写testMethod(Animal-Animal),该方法可以接受Animal类型的任何对象或其子对象(因为它们继承而也是Animal)。 如果此功能不可用,那么您将为不同种类的动物编写不同的方法


希望有帮助

也许,当你使用

萨摩耶s=宠物

你应该像这样投

萨莫耶德s=(萨莫耶德)宠物

当然,它可能会丢失一些信息

Samoyed s = pet; 
将产生编译时错误,因为pet是哺乳动物,而哺乳动物不一定是萨摩亚人。但是如果你显式地抛出它

Samoyed s = (Samoyed)pet;

不会有编译错误。然而,这行代码在运行时会抛出一个ClassCastException,因为pet的实际类是Dog,Dog不是Samoyed的子类

@TylerPierog这有帮助吗?我刚刚重读了你的问题我第一次误读了。