我得到了这份家庭作业的声明。
哺乳动物宠物=新狗();
萨摩耶 s = 宠物;
我们得到了一个这样的图表:
动物 ---> 脊椎动物 ---> 哺乳动物 ---> 狗 ---> 哈士奇、萨摩耶、比格犬
我的理解是该代码无效且无法强制转换。Mammal 指的是 Dog 对象,而 Samoyed 类型不在 Dog 或 Mammal 中。
那是对的吗?
Samoyed s = pet;
将产生编译时错误,因为宠物是哺乳动物,而哺乳动物不一定是萨摩耶。但是如果你明确地转换它
Samoyed s = (Samoyed)pet;
不会有编译错误。尽管如此,这一行将在运行时抛出 ClassCastException,因为 pet 的实际类是 Dog 并且 Dog 不是 Samoyed 的子类
您可以将子引用放在父对象中,但反向不正确。第一个陈述是有效的,因为 Dog 是 Mammal 的孩子。但是第二个语句是不正确的,因为您试图将 Mammal 的父对象引用到其子引用 Samoyed。
基本上 JVM 使用父对象的概念来保存多态性的任何子引用。想象一个场景,你必须设计一个可以接受任何动物输入的方法。您可以简单地编写 testMethod(Animal animal),该方法可以接受任何 Animal 类型的对象或其子对象(它们也是动物,因为它们继承了)。如果此功能不可用,那么您最终将为不同种类的动物编写不同的方法。
希望能帮助到你!
这不是有效的强制转换,因为它试图将 的实例分配给Dog
声明为 type 的变量Samoyed
。你的假设是正确的。
也许,宠物是个大物,当你使用
萨摩耶 s = 宠物;
你应该投它,喜欢这个
萨摩耶 s = (萨摩耶)宠物;
当然,它可能会丢失一些信息。