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
相关产品推荐
相关产品推荐

