【JAVA面试】接口和抽象类

embedded/2025/1/11 17:55:27/

在四层架构(Controller, Service, ServiceImpl, Mapper)的设计中,接口和抽象类的选择对代码的可扩展性和设计模式的使用有很大影响。以下是接口(interface)和抽象类(abstract class)的区别,以及它们在该架构中的应用分析。


1. 接口(Interface)

特点
  • 完全抽象:接口中的方法默认是 public abstract,字段是 public static final
  • 多实现:一个类可以实现多个接口,这支持多重继承。
  • 行为契约:接口定义了一组行为契约,规定实现类必须实现哪些方法。
使用场景
  • 用于 定义能力规范,实现代码的松耦合。
  • 强调行为的一致性,适合描述“做什么”的角色。
在四层架构中的应用
  • Service 层:通常使用接口来定义业务逻辑的规范。例如:
    java">public interface UserService {UserDTO getUserById(String id);void createUser(UserDTO userDTO);
    }
    
    • 优势
      1. 提供行为的统一定义,多个实现可以共用同一个接口。
      2. Controller 层可以依赖 UserService 接口,方便进行替换(如 Mock 实现或不同业务逻辑实现)。
      3. 便于单元测试和依赖注入(如 Spring 的 @Autowired 注入)。

2. 抽象类(Abstract Class)

特点
  • 部分实现:抽象类可以包含抽象方法(abstract)和非抽象方法(带有实现)。
  • 单继承:一个类只能继承一个抽象类,但抽象类可以实现多个接口。
  • 状态和行为共享:抽象类可以有实例变量和方法实现,用于共享逻辑。
使用场景
  • 用于 定义通用的行为状态,并由子类继承和扩展。
  • 强调“是什么”的角色,适合描述基础类或模板模式。
在四层架构中的应用
  • ServiceImpl 层:可以使用抽象类来共享通用逻辑。例如:
    java">public abstract class AbstractUserService implements UserService {@Overridepublic UserDTO getUserById(String id) {System.out.println("Logging user access: " + id);return findUserById(id);}// 需要子类实现的抽象方法protected abstract UserDTO findUserById(String id);
    }
    
    • 优势
      1. 共享公共的实现逻辑,避免重复代码。
      2. 允许子类专注于具体的实现,增强代码复用性。

3. 接口与抽象类的区别对比

特性接口(Interface)抽象类(Abstract Class)
多继承支持一个类可以实现多个接口。一个类只能继承一个抽象类。
方法实现方法不能有实现(Java 8 之后允许默认方法)。可以包含方法实现。
字段支持只能有 static final 常量。可以有实例变量和静态变量。
目的定义行为规范,强调“做什么”。定义基础实现,强调“是什么”。
使用场景适合描述能力或行为(如服务层)。适合实现部分通用逻辑(如业务逻辑共享)。
耦合性接口解耦更强,便于替换。抽象类耦合性相对更强,提供默认实现。

4. 示例:四层架构中接口和抽象类的配合使用

接口(定义规范)
  • UserService:定义业务逻辑的接口。
    java">public interface UserService {UserDTO getUserById(String id);void createUser(UserDTO userDTO);
    }
    
抽象类(共享逻辑)
  • AbstractUserService:实现 UserService 接口,并提供部分通用逻辑。
    java">public abstract class AbstractUserService implements UserService {@Overridepublic void createUser(UserDTO userDTO) {System.out.println("Logging user creation...");saveUser(userDTO); // 具体的实现交给子类}protected abstract void saveUser(UserDTO userDTO);
    }
    
具体实现类(业务逻辑实现)
  • UserServiceImpl:继承抽象类,完成特定逻辑实现。
    java">public class UserServiceImpl extends AbstractUserService {@Overridepublic UserDTO getUserById(String id) {// 特定的实现逻辑return new UserDTO(id, "John Doe");}@Overrideprotected void saveUser(UserDTO userDTO) {System.out.println("Saving user to database: " + userDTO);}
    }
    
Controller 层(使用接口)
  • 通过接口调用具体实现类,保证松耦合。
    java">@RestController
    public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@GetMapping("/user/{id}")public ResponseEntity<UserDTO> getUserById(@PathVariable String id) {UserDTO user = userService.getUserById(id);return ResponseEntity.ok(user);}
    }
    

5. 总结

  • 接口

    • 定义行为的规范,强制实现类实现方法。
    • 适用于 ControllerService 层,便于接口替换和单元测试。
  • 抽象类

    • 提供默认实现,减少代码重复。
    • 适用于 ServiceImpl 层,便于共享通用逻辑。

在实际开发中,接口和抽象类经常结合使用:接口定义行为规范,抽象类提供部分实现,具体实现类完成剩余逻辑。这种设计既保证了代码的灵活性,又增强了可维护性。


http://www.ppmy.cn/embedded/153076.html

相关文章

统计学习方法(第二版) 第五章 决策树

本章主要讨论决策树模型&#xff0c;以及生成、剪枝和分类的方法。 剪枝方法的补充 统计学习方法(第二版) 第五章 补充-CSDN博客 目录 基础数学知识&#xff1a; 1.自信息量 2.互信息 3.平均自信息量和熵 4.熵函数的性质 5.联合熵和条件熵 6.平均互信息量&#xff08;…

蓝桥杯嵌入式速通(1)

1.工程准备 创建一文件夹存放自己的代码&#xff0c;并在mdk中include上文件夹地址 把所有自身代码的头文件都放在headfile头文件中&#xff0c;之后只需要在新的文件中引用headfile即可 headfile中先提前可加入 #include "stdio.h" #include "string.h"…

在离线环境中安装 `.rpm` 包的步骤

在一些环境中&#xff0c;可能无法直接通过网络安装软件包。特别是在没有互联网连接的情况下&#xff0c;我们仍然可以手动下载 .rpm 安装包并进行离线安装。本文将介绍如何在离线环境中安装多个 .rpm 包&#xff0c;确保软件的顺利安装和依赖关系的处理。 1. 将 .rpm 文件复制…

sql 函数

# 四则运算 - * / # 函数 distinct 、count、sum、max、min、avg、sum、round select concat(device_id 是,device_id ) device_id from device_id_apply_factor where device_id D6A42CE6A0; select concat_ws(|||,device_id ,factor_a ,module_type) from 、device_id_app…

SSL 证书格式和证书文件扩展名:完整指南

SSL 证书是什么以及它如何工作相当容易理解。但当涉及到在服务器上安装它时&#xff0c;有时&#xff0c;你可能觉得这是在处理火箭科学。 由于有如此多的SSL 证书格式与特定服务器要求相关&#xff0c;您更有可能感到困惑和沮丧&#xff0c;而不是从一开始就正确配置证书。但…

热门力反馈手套对比,机器人遥操作完美解决方案

随着机器人技术的快速发展&#xff0c;遥操作机器人作为代替人类在危险环境中完成高危任务或在医疗领域完成远程精密手术的完美解决方案&#xff0c;正在快速进步&#xff0c;并有望成为拥有巨大潜力的机器人行业的全新发展方向。 本文将就推动机器人遥操作领域发展的力反馈手…

python初体验: 处理excel数据

一. data.xlsx 二.python代码 import pandas as pd# 读取 Excel 文件 df pd.read_excel(./data.xlsx, sheet_nameSheet1, usecols[Name, Age, City])# 查看数据 print(df.head())# 筛选数据 df_filtered df[df[Age] > 30]# 添加新列 df_filtered[Salary] df_filtered[Ag…

AI刷题-异或编码、拼凑单词 chi

目录 一、异或编码 问题描述 测试样例 解题思路&#xff1a; 问题理解 解题思路 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、拼凑单词 chi 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&a…