array has been casted to associate the method with the correct child class 是什么意思?

问题描述 投票:0回答:2

我正在练习AP comp sci A,当我看到以下问题时:

继承层次如下: Dog、Snake 和 Chimpanzee 类是抽象类 Animal 的子类。 假设以下行出现在代码的前面,为什么代码段

animals[i].speak();
在运行时没有给我们错误的最佳解释是什么?
Animal[] animals = new Animal[10];

(a)

animals
数组仅包含对 Animal 对象的引用,这些对象具有在该子类中定义的
speak()
方法。

(b)

animals
数组被显式转换为正确的子类,以便
speak()
方法与正确的子类相关联。

(c)

Animal
类有一个名为
speak()
的方法,它被所有子类继承和定义。

(d)

Animal
类是一个可实例化的类,它定义了自己的
speak()
方法。

(e)

Animal
类是
Dog
的子类,它定义了一个
speak()
方法。

我对选项 (a) 和 (b) 感到困惑。谁能解释一下这些选项在说什么?

java inheritance abstract-class
2个回答
0
投票

根据我对选项的解释:

  • (a) 选项表明只有子类 Dog 和 Snake 定义了 speak() 方法,并且

    animals
    数组仅包含 Dog 或 Snake 而没有 Chimpanzee。

  • (b) 选项表明

    animals
    数组仅包含父类 Animal 的实例,并且这些对象在执行期间被转换为 Snake Dog 或 Chimpanzee 以使用子类的 speak() 方法。

但是这两个选项的措辞很奇怪,目前还不清楚这是否是对选项的预期解释。


0
投票

Dog
有一个
.speak()
方法,但是
Snake
没有。您可以将数组中的动物投射到
Dog
并使用
.speak()
。假设数组只填充了
Dog
个实例。

因为没有铸造 (b) 是不正确的。

选项 (a) 听起来是正确的,因为

animals[i]
返回一个
Animal
并且它必须有方法
.speak();
。虽然选项的编写方式表明数组仅填充具有
Animal
.speak()
实例,其他实例可能没有该方法。如果
Animal
没有方法
speak()
方法那么这将不会编译或运行。

© www.soinside.com 2019 - 2024. All rights reserved.