我正在练习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) 感到困惑。谁能解释一下这些选项在说什么?
根据我对选项的解释:
(a) 选项表明只有子类 Dog 和 Snake 定义了 speak() 方法,并且
animals
数组仅包含 Dog 或 Snake 而没有 Chimpanzee。
(b) 选项表明
animals
数组仅包含父类 Animal 的实例,并且这些对象在执行期间被转换为 Snake Dog 或 Chimpanzee 以使用子类的 speak() 方法。
但是这两个选项的措辞很奇怪,目前还不清楚这是否是对选项的预期解释。
说
Dog
有一个.speak()
方法,但是Snake
没有。您可以将数组中的动物投射到 Dog
并使用 .speak()
。假设数组只填充了 Dog
个实例。
因为没有铸造 (b) 是不正确的。
选项 (a) 听起来是正确的,因为
animals[i]
返回一个 Animal
并且它必须有方法 .speak();
。虽然选项的编写方式表明数组仅填充具有 Animal
的 .speak()
实例,其他实例可能没有该方法。如果 Animal
没有方法 speak()
方法那么这将不会编译或运行。