2013-05-03 89 views
1

我被授予这份声明作业。对象和铸造java

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

Samoyed s = pet;

我们得到一个示意图如下所示:

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

我的理解是,代码无效并且无法投射。哺乳动物指狗对象,萨摩耶类型不在犬或哺乳动物中。

这是正确的吗?

回答

0

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

+0

@TylerPierog这有帮助吗?我刚刚重读了你的问题,我第一次误解了它。 – 2013-05-03 01:00:38

+0

是的,这确实有帮助。感谢您的澄清 – 2013-05-03 01:13:54

1

您可以在父对象中放置子引用,但反向不是真实的。由于狗是哺乳动物的孩子,所以首先声明是有效的。但是第二种说法是不正确的,因为您正尝试将哺乳动物的父对象用于其子参考萨摩耶德。

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

希望它能帮助!

0

也许,在宠物是一个很大的物体,当你使用

萨摩耶S =宠物;

你要抛弃它,链接才可这个

萨摩耶S =(萨摩)的宠物;

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

1
Samoyed s = pet; 

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

Samoyed s = (Samoyed)pet; 

将不会出现编译错误。尽管如此,这条线会在运行时抛出一个ClassCastException,因为实际的宠物类是Dog和Dog不是Samoyed的子类