
前言很多人会问Java 中接口和类的作用是不是一个定义了方法契约另一个定义了业务执行的必要流程方向是对的但不够准确。更准确的说法是· 接口定义“能做什么”的契约· 类定义“是什么”以及“怎么做”· 抽象类介于两者之间可以定义部分实现也可以定义流程骨架。下面逐一说明。接口定义契约接口强调能力和规范不关心具体实现。interfacePayService{voidpay(BigDecimalamount);}它只规定凡是 PayService都必须能 pay。至于用支付宝、微信还是银行卡接口不关心。接口的特点· 不能实例化· 不能保存对象状态只能有 public static final 常量· 方法默认是 public abstract· Java 8 后可以有 default、static 方法· Java 9 后可以有 private 方法· 一个类可以实现多个接口。核心作用解耦、多态、面向接口编程。类定义具体实现类描述一个具体类型包含状态、行为和具体实现。classAlipayServiceimplementsPayService{Overridepublicvoidpay(BigDecimalamount){// 调用支付宝支付}}类不仅定义行为还可以定义对象的状态和生命周期。普通类不一定负责“业务必要流程”它可能只是· 一个数据载体· 一个工具类· 一个具体实现类· 一个服务编排类。所以类更准确的定位是定义“是什么”以及“怎么做”。谁定义业务执行流程业务执行的必要流程通常不是接口定义的而可能由· 抽象类 模板方法定义· 具体服务类编排· 领域服务 / 应用服务控制。例如模板方法abstractclassAbstractOrderService{publicfinalvoidcreateOrder(){validate();pay();save();}protectedabstractvoidvalidate();protectedabstractvoidpay();protectedabstractvoidsave();}这里· AbstractOrderService 定义了流程骨架· 子类实现具体步骤· 接口仍然只负责定义契约。所以接口一般不定义流程抽象类才常用来定义“流程骨架”。接口和类对比维度 接口 类核心作用 定义契约、能力 定义状态、行为、具体实现关注点 能做什么 是什么、怎么做实例化 不能 普通类可以抽象类不能继承 多实现 单继承流程定义 一般不定义 抽象类可定义骨架具体类可实现典型用途 解耦、多态、规范 封装、复用、实现业务总结一句话接口管契约类管实现抽象类可以管“部分实现 流程骨架”具体类负责把流程跑通。实际开发中· 面向接口编程降低耦合· 用抽象类复用流程骨架· 用具体类完成业务细节· 不要让接口承担流程编排职责。选对抽象层次代码才会既灵活又清晰。