java 接口本身不可实例化,但可以声明接口类型的引用变量,指向实现了该接口的具体类对象;list<vehicle> 存储的是 vehicle 接口的实现类实例,因此循环中调用 v.getmileage() 完全合法且体现多态本质。
java 接口本身不可实例化,但可以声明接口类型的引用变量,指向实现了该接口的具体类对象;list<vehicle> 存储的是 vehicle 接口的实现类实例,因此循环中调用 v.getmileage() 完全合法且体现多态本质。
在 Java 中,接口(interface)不是类,不能使用 new Vehicle() 直接创建对象——这是编译错误。但接口的核心价值恰恰在于它定义了一组行为契约,允许不同类以统一方式被使用。这正是面向接口编程和运行时多态(Runtime Polymorphism) 的基础。
回到题目中的关键代码:
private List<Vehicle> myVehicles;
// ...
for (Vehicle v : myVehicles) {
sum += /* expression */;
}这里的 v 是一个类型为 Vehicle 的引用变量,而非实际对象。myVehicles 列表中存储的并非“接口对象”,而是实现了 Vehicle 接口的具体类的实例,例如:
class Car implements Vehicle {
private double mileage;
public Car(double mileage) { this.mileage = mileage; }
@Override
public double getMileage() { return mileage; }
}
class Bicycle implements Vehicle {
private double mileage;
public Bicycle(double mileage) { this.mileage = mileage; }
@Override
public double getMileage() { return mileage; }
}初始化时可安全添加:
立即学习“Java免费学习笔记(深入)”;
List<Vehicle> myVehicles = new ArrayList<>(); myVehicles.add(new Car(12500.5)); myVehicles.add(new Bicycle(842.3)); myVehicles.add(new Car(47000.0));
此时 myVehicles 是一个类型安全的集合:编译器确保所有元素都支持 getMileage() 方法;运行时则根据每个对象的实际类型(Car 或 Bicycle),动态调用其各自重写的 getMileage() 实现——这就是动态绑定(Dynamic Method Dispatch)。
因此,正确答案是:(a) v.getMileage()
- ✅ 合法:v 是 Vehicle 引用,而 getMileage() 是接口声明的公共方法;
- ✅ 有效:JVM 在运行时自动分派到具体子类实现;
- ❌ 其他选项均错误:
- (b) getMileage(v):无此静态方法,接口不提供工具方法;
- (c) Vehicle.get(v):接口无静态工厂方法,语法非法;
- (d) myVehicles.get(v):v 是 Vehicle 对象,非索引(应为 int 类型);
- (e) 错误前提:List<Vehicle> 可正常遍历并调用接口方法,绝非编译失败。
⚠️ 注意事项:
- 接口引用只能访问接口中声明的方法(或其父接口/Object 类方法),无法调用实现类独有的方法;
- 若需调用子类特有功能,必须向下转型(如 (Car) v),但需配合 instanceof 检查以避免 ClassCastException;
- 使用接口类型作为参数、返回值或字段类型,能显著提升代码可扩展性与可测试性(如轻松替换模拟实现进行单元测试)。
总结:“不能创建接口对象” ≠ “不能使用接口类型”。恰恰相反,用接口类型组织代码,是 Java 实现松耦合、高内聚设计的关键实践。


















