1

我得到了这份家庭作业的声明。

哺乳动物宠物=新狗();

萨摩耶 s = 宠物;

我们得到了一个这样的图表:

动物 ---> 脊椎动物 ---> 哺乳动物 ---> 狗 ---> 哈士奇、萨摩耶、比格犬

我的理解是该代码无效且无法强制转换。Mammal 指的是 Dog 对象,而 Samoyed 类型不在 Dog 或 Mammal 中。

那是对的吗?

4

4 回答 4

1
Samoyed s = pet; 

将产生编译时错误,因为宠物是哺乳动物,而哺乳动物不一定是萨摩耶。但是如果你明确地转换它

Samoyed s = (Samoyed)pet;

不会有编译错误。尽管如此,这一行将在运行时抛出 ClassCastException,因为 pet 的实际类是 Dog 并且 Dog 不是 Samoyed 的子类

于 2013-05-03T03:50:41.950 回答
1

您可以将子引用放在父对象中,但反向不正确。第一个陈述是有效的,因为 Dog 是 Mammal 的孩子。但是第二个语句是不正确的,因为您试图将 Mammal 的父对象引用到其子引用 Samoyed。

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

希望能帮助到你!

于 2013-05-03T01:12:08.363 回答
0

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

于 2013-05-03T00:52:16.023 回答
0

也许,宠物是个大物,当你使用

萨摩耶 s = 宠物;

你应该投它,喜欢这个

萨摩耶 s = (萨摩耶)宠物;

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

于 2013-05-03T01:21:25.727 回答