MST

星途 面试题库

面试题:Java抽象类代码复用与接口的权衡

在Java开发中,我们既可以通过抽象类实现代码复用,也可以使用接口来达到一定程度的功能复用。请详细分析在何种场景下应优先选择抽象类进行代码复用,何种场景下应优先使用接口,并且结合实际项目案例说明二者在代码复用方面的优势与劣势。
32.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

优先选择抽象类的场景

  1. 有共同实现代码:当多个子类有大量共同的实现代码时,优先选择抽象类。例如在一个图形绘制的项目中,有圆形、矩形、三角形等图形类。这些图形都有计算面积和周长的方法,并且可能有一些通用的属性如颜色。可以创建一个抽象的Shape类,在其中定义通用的属性和部分通用的计算逻辑(如设置颜色的方法)。
    • 优势:代码复用性高,通过继承抽象类,子类可以直接复用父类的属性和方法,减少代码冗余。比如上述Shape类中设置颜色的方法,所有子类都无需重复编写。
    • 劣势:Java不支持多重继承,若一个类已经继承了某个抽象类,就无法再继承其他抽象类,限制了类的继承结构扩展性。
  2. 定义模板方法:在需要定义一个算法的骨架,由子类去实现某些步骤时,适合用抽象类。例如开发一个数据处理流程的项目,数据读取、处理、存储是固定流程,但数据的具体读取方式(如从文件读还是从数据库读)、处理方式、存储方式不同。可以创建一个抽象类DataProcessor,定义一个模板方法processData包含数据读取、处理、存储的调用顺序,让子类去实现具体的读取、处理、存储方法。
    • 优势:能很好地定义算法框架,子类只需专注于实现特定步骤,使代码结构清晰,便于维护和扩展。
    • 劣势:子类对抽象类依赖较强,一旦抽象类的接口或实现改变,可能影响所有子类。

优先选择接口的场景

  1. 实现多态行为:当需要一个类实现多种不同类型的行为时,接口是首选。比如在一个电商系统中,商品类可能需要实现“可打折”“可推荐”“可评价”等多种行为,通过实现DiscountableRecommendableEvaluable等接口来实现不同行为。
    • 优势:一个类可以实现多个接口,实现了更灵活的多态性,增强了类的功能扩展性。商品类可以同时具备打折、推荐、评价等功能。
    • 劣势:接口中方法默认是抽象的,实现接口的类需要实现接口中所有方法,若接口方法较多,实现类的代码量可能较大。
  2. 定义标准规范:当需要定义一组标准规范,不同类遵循该规范时,使用接口。例如在支付系统中,定义一个Payment接口,包含pay方法,具体的支付方式类如AlipayPaymentWechatPayment等实现该接口,统一支付操作规范。
    • 优势:统一了不同实现类的行为标准,便于系统集成和维护。不同支付方式类都遵循Payment接口规范,在调用支付功能时可以统一处理。
    • 劣势:由于接口方法必须全部实现,对于一些简单实现可能造成代码冗余,每个实现类都要实现一遍接口方法。