AP计算机科学A:多态代码无运行时错误的选项解析求助
AP计算机科学A题目疑问解答:选项(a)(b)含义解析
核心前提回顾
已知Animal是抽象类,Dog、Snake、Chimpanzee是它的子类,代码Animal[] animals = new Animal[10];,调用animals[i].speak();运行无错误,以下是你困惑的两个选项的详细解析:
选项(a)的含义
- 该选项表达的是:
animals数组中存储的所有对象引用,对应的实际子类对象都自行定义了speak()方法。 - 但这里存在逻辑漏洞:如果抽象类
Animal本身没有声明speak()方法(不管是抽象还是具体实现),哪怕所有子类都写了speak(),编译阶段就会报错——因为编译器只检查引用类型Animal是否包含speak()方法,不会管实际指向的子类对象有没有。所以这个选项描述的情况根本无法通过编译,更谈不上解释运行时无错误的原因。
选项(b)的含义
- 该选项的意思是:代码中对
animals数组的元素做了显式类型转换(比如写成((Dog)animals[i]).speak();),通过强制转换为对应子类,让speak()方法绑定到子类的实现。 - 但题目给出的代码是直接调用
animals[i].speak();,并没有显式转换的操作。而且Java的多态机制会自动在运行时绑定子类的重写方法,完全不需要显式转换就能正常调用,所以这个选项描述的场景和题目代码不匹配。
额外补充:正确选项逻辑
这道题的正确选项是(c):抽象类Animal必然包含speak()方法(要么是抽象方法要求子类实现,要么是有具体实现被子类重写),这样编译器能通过检查(因为引用类型Animal存在speak()方法),运行时依靠多态自动调用对应子类的实现,因此不会出现错误。
内容的提问来源于stack exchange,提问作者user21737217
相关产品推荐
相关产品推荐

