接口回答“它能做什么”,是行为契约,强调can-do关系,支持多实现、解耦;抽象类回答“它是什么”,是类的模板,强调is-a关系,支持单继承、代码复用与状态共享。

直接说核心:接口回答“它能做什么”,抽象类回答“它是什么”。
接口是自上而下的行为契约
先有需求,再定规范。比如系统需要支持“支付”“退款”“对账”,不管你是微信支付、支付宝还是银联,只要接入就得实现这些动作。接口不关心你是谁、怎么存数据、有没有状态,只强制你提供这几个公开行为。这种设计天然适合解耦——调用方只依赖接口,不依赖具体实现,换掉一个支付渠道,其他模块完全不用改。
抽象类是自下而上的共性提炼
先有多个相似类,再抽骨架。比如订单服务里有线上订单、线下订单、团购订单,它们都有订单号、创建时间、状态机、通用的校验逻辑。把这些重复代码和字段提到一个抽象类里,子类直接复用,只专注自己独有的部分(比如团购要校验库存,线上订单要走风控)。抽象类带构造器、带状态、带可继承的方法,本质是一个“半成品模板”。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
is-a 和 has-a 的关系很关键
子类 extends 抽象类,表达的是“是一种”:线下订单 是一种 订单;而 implements 接口,表达的是“具备某种能力”:这个订单 具备可取消能力,那个订单 具备可导出能力。一个类只能是一种东西(单继承),但可以同时具备多种能力(多实现)。
框架设计里为什么偏爱接口
Spring 的 BeanFactory、JDBC 的 Connection、MyBatis 的 SqlSession,全都是接口。因为框架不预设你用什么数据库、什么连接池、什么代理方式——它只定义“你得给我一个能 getBean() 的东西”“你得给我一个能 execute() 的东西”。接口让扩展开放、修改封闭,这才是面向对象设计原则落地的关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










