构造对象实例时创建的输出是什么

Sc4*_*c4r 1 java

假设以下代码运行时没有错误:

在此输入图像描述

并假设在其他一些类中我们有一个主方法: A var1 = new C();

我得到了这两个问题,我回答错了:

1)通过构造C的实例将创建什么输出?

我对此的回答是一些,我认为这是因为它说new C();,所以它创建了一个新的C对象,并在该类的构造函数中打印一些.但我错了,正确答案就是这里的一些.这对我来说没有意义,我真的不知道那是怎么回事.

2)如果使用方法调用,((B) var1).report()则调用哪个方法.

我对此的回答是B类中的方法报告.我认为这是正确的答案,因为var1是用B转换的,所以我假设它将使用B类中的方法.但我也错了.正确答案是C类中的方法.这对我来说也没有意义.

这非常令人困惑,我真的不知道如何得到这些答案.如果有人能够向我解释究竟发生了什么,以及他们如何得到那些真正值得赞赏的答案.

小智 5

答案1).部分正确的是,将调用C的构造函数,但不要忘记子对象将始终在其父对象上调用构造函数.如果子类没有指定要调用的构造函数,那么将使用no-args构造函数.

所以在C的构造函数中,编译器添加了对super()的调用,它调用了B上的构造函数,再一次编译器添加了对super()的调用,调用了A上的构造函数.所以整个链最终结束了是A() - > B() - > C().

答案2).即使将arg1强制转换为B,它仍然是C的实例.因此,多态将导致对C上的report()方法的调用.

如果将A重命名为Animal,B将重命名为Mammal,将C重命名为Dog,则可能更容易想象.所以你可以将一个狗的实例称为动物或哺乳动物而且它是正确的,但它并没有改变它仍然是狗的事实.希望有所帮助.