You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:57:14