面试题答案
一键面试优先选择抽象类的场景
- 有共同实现代码:当多个子类有大量共同的实现代码时,优先选择抽象类。例如在一个图形绘制的项目中,有圆形、矩形、三角形等图形类。这些图形都有计算面积和周长的方法,并且可能有一些通用的属性如颜色。可以创建一个抽象的
Shape
类,在其中定义通用的属性和部分通用的计算逻辑(如设置颜色的方法)。- 优势:代码复用性高,通过继承抽象类,子类可以直接复用父类的属性和方法,减少代码冗余。比如上述
Shape
类中设置颜色的方法,所有子类都无需重复编写。 - 劣势:Java不支持多重继承,若一个类已经继承了某个抽象类,就无法再继承其他抽象类,限制了类的继承结构扩展性。
- 优势:代码复用性高,通过继承抽象类,子类可以直接复用父类的属性和方法,减少代码冗余。比如上述
- 定义模板方法:在需要定义一个算法的骨架,由子类去实现某些步骤时,适合用抽象类。例如开发一个数据处理流程的项目,数据读取、处理、存储是固定流程,但数据的具体读取方式(如从文件读还是从数据库读)、处理方式、存储方式不同。可以创建一个抽象类
DataProcessor
,定义一个模板方法processData
包含数据读取、处理、存储的调用顺序,让子类去实现具体的读取、处理、存储方法。- 优势:能很好地定义算法框架,子类只需专注于实现特定步骤,使代码结构清晰,便于维护和扩展。
- 劣势:子类对抽象类依赖较强,一旦抽象类的接口或实现改变,可能影响所有子类。
优先选择接口的场景
- 实现多态行为:当需要一个类实现多种不同类型的行为时,接口是首选。比如在一个电商系统中,商品类可能需要实现“可打折”“可推荐”“可评价”等多种行为,通过实现
Discountable
、Recommendable
、Evaluable
等接口来实现不同行为。- 优势:一个类可以实现多个接口,实现了更灵活的多态性,增强了类的功能扩展性。商品类可以同时具备打折、推荐、评价等功能。
- 劣势:接口中方法默认是抽象的,实现接口的类需要实现接口中所有方法,若接口方法较多,实现类的代码量可能较大。
- 定义标准规范:当需要定义一组标准规范,不同类遵循该规范时,使用接口。例如在支付系统中,定义一个
Payment
接口,包含pay
方法,具体的支付方式类如AlipayPayment
、WechatPayment
等实现该接口,统一支付操作规范。- 优势:统一了不同实现类的行为标准,便于系统集成和维护。不同支付方式类都遵循
Payment
接口规范,在调用支付功能时可以统一处理。 - 劣势:由于接口方法必须全部实现,对于一些简单实现可能造成代码冗余,每个实现类都要实现一遍接口方法。
- 优势:统一了不同实现类的行为标准,便于系统集成和维护。不同支付方式类都遵循