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

Java能否创建接口类型对象?AP计算机科学编程题答疑

AP计算机科学编程题

给出如下接口和类声明,请问哪个选项可替换/* expression */,使getTotalMileage方法返回车队所有车辆的总行驶里程?

public interface Vehicle
{
    /** @return the mileage traveled by this Vehicle */
    double getMileage();
}

public class Fleet
{
    private List<Vehicle> myVehicles;
    /** @return the mileage traveled by all vehicles in this Fleet */
    
    public double getTotalMileage()
    {
        double sum = 0.0;
        for (Vehicle v : myVehicles)
        {
            sum += /* expression */;
        }
        return sum;
    }
    // There may be instance variables, constructors, and methods are not shown.
}

选项

  • (a) v.getMileage()
  • (b) getMileage(v)
  • (c) Vehicle.get(v).getMileage()
  • (d) myVehicles.get(v).getMileage()
  • (e) 这段代码无法编译,因为无法从List接口引用变量调用方法

问题解析与疑问解答

正确选项分析

正确答案是**(a)**。在增强for循环中,v是myVehicles列表中迭代到的Vehicle类型引用,接口中定义了getMileage()实例方法,所有实现Vehicle接口的类都必须实现该方法,因此可以直接通过v.getMileage()调用方法获取单辆车的里程并累加。

其他选项错误原因:

  • (b):getMileage()是实例方法,不能以“方法名+对象参数”的形式调用,语法错误。
  • (c):Vehicle是接口,不存在get(v)静态方法,语法错误。
  • (d):myVehicles.get()方法需要传入int类型的索引值,而v是Vehicle对象,参数类型不匹配,编译报错。
  • (e):代码可以正常编译,List的增强for循环是合法语法,只要列表中存储的是实现Vehicle接口的具体类对象即可。

接口类型列表的编译疑问

List<Vehicle> myVehicles不会导致编译错误,原因如下:

  • 列表存储的不是接口类型的对象,而是实现了Vehicle接口的具体类对象。接口本身不能被实例化,但Java允许用接口类型的引用指向其实现类的对象,这是多态的核心特性。
  • 比如可以定义Car implements Vehicle、Truck implements Vehicle这类具体类,将new Car()、new Truck()这类对象添加到myVehicles列表中,此时Vehicle v的引用就能指向这些具体对象,调用getMileage()时会执行对应实现类的方法,完全符合Java语法规范。

内容的提问来源于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 10:52:49