面试题答案
一键面试抽象类与接口的特性分析
- 抽象类:
- 特点:可以包含抽象方法和具体方法,有成员变量,可以有构造函数。子类继承抽象类,只能单继承。
- 适用场景:当多个模块有一些共同的基础实现逻辑,并且这些模块之间具有一定的“is - a”关系时,适合使用抽象类。例如,一个电商项目中,“商品”可以是一个抽象类,“电子产品”“服装”等具体商品类继承自“商品”抽象类,“商品”抽象类中可以定义如“获取商品名称”“获取商品价格”等通用方法的具体实现。
- 接口:
- 特点:只能包含抽象方法(在 Java 8 及以后可以有默认方法和静态方法,但主要还是抽象方法),没有成员变量(只有静态常量),没有构造函数。类可以实现多个接口。
- 适用场景:当需要对模块进行特定的行为约束,且这些模块之间不存在严格的“is - a”关系时,适合使用接口。比如在电商项目中,“可打折”“可评价”可以定义为接口,不同类型的商品只要实现这些接口,就具备相应的行为。
权衡使用的原则
- 可维护性:
- 抽象类:如果多个模块的基础逻辑变化频繁,使用抽象类更便于维护,因为修改抽象类中的基础方法,所有子类都会继承这些修改。例如电商项目中,如果商品价格的计算逻辑改变,在“商品”抽象类中修改“获取商品价格”方法,所有具体商品子类都会应用新的逻辑。
- 接口:当特定行为约束发生变化时,接口更易于维护。因为实现接口的类可以独立修改其实现,不影响其他实现该接口的类。如“可打折”接口的打折算法改变,每个实现该接口的商品类可以独立调整自己的打折逻辑。
- 可扩展性:
- 抽象类:由于单继承的限制,扩展性相对较弱。如果一个类已经继承了一个抽象类,就不能再继承其他抽象类来扩展功能。比如“电子产品”类继承了“商品”抽象类,就不能再继承其他抽象类。
- 接口:类可以实现多个接口,扩展性强。一个商品类可以同时实现“可打折”“可评价”“可收藏”等多个接口,灵活增加功能。
- 性能:
- 抽象类:由于可以有具体方法和成员变量,在内存使用上相对接口可能会稍大一些,但如果合理设计,对性能影响不大。例如“商品”抽象类中如果有一些成员变量用于缓存商品的某些信息,可能会占用一定内存。
- 接口:接口只定义方法签名,没有成员变量,在内存使用上相对更轻量级,性能损耗较小。
具体项目案例
假设我们正在开发一个在线教育平台前端项目。
- 模块分析:
- 项目中有课程模块、学习资料模块等多个模块。课程模块又分为视频课程、图文课程等不同类型。
- 课程模块需要共享一些基础逻辑,如获取课程基本信息(标题、简介等),不同类型课程有不同的展示方式但都需要遵循一定的展示规范。
- 架构设计:
- 使用抽象类:定义一个“课程”抽象类,包含获取课程基本信息等基础方法的具体实现。“视频课程”类和“图文课程”类继承自“课程”抽象类。这样,当课程基本信息的获取逻辑改变时,只需要在“课程”抽象类中修改,所有课程子类都会应用新逻辑,提高可维护性。
- 使用接口:定义“可预览”接口,规定课程预览的行为。“视频课程”和“图文课程”都实现该接口,但各自有不同的预览实现方式。如果后续需要增加新的课程类型,只要实现“可预览”接口即可,增强了可扩展性。同时,接口的轻量级特性也保证了一定的性能优势。