接口定义“能做什么”,强调行为契约;抽象类定义“是什么”,强调类型模板与共性状态。接口字段全为public static final,方法默认public且无构造器;抽象类可含各种成员变量、完整方法体及构造方法。

直接看这张表,比死记硬背管用得多。重点不是罗列所有语法点,而是抓住那些一选错就编译报错、一混淆就设计出问题的关键项。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
核心设计意图
接口是“能做什么”——行为契约,比如 Flyable、Runnable、Serializable,不关心你是鸟还是飞机,只要能飞、能跑、能序列化,就实现它。
抽象类是“是什么”——类型模板,比如 Animal、Shape、Vehicle,强调共性状态(name、color、area)和可复用逻辑(sleep()、draw()),子类天然属于这个家族。
语法与结构差异
- 成员变量:接口里所有字段自动是 public static final 常量,不能改;抽象类可以有 private 实例变量、protected 静态变量、甚至 volatile 字段
- 方法实现:接口在 Java 8+ 支持 default 和 static 方法,但不能有构造器、不能有 this 引用;抽象类可写完整方法体、可调用 super()、可含构造方法供子类初始化
- 访问修饰符:接口方法默认 public,不能用 private/protected;抽象类方法可自由使用 private(供内部调用)、protected(供子类继承)、public
继承机制与使用约束
- 一个类只能 extends 一个抽象类,但可以 implements 多个接口(比如 class Drone extends Machine implements Flyable, Runnable, Chargeable)
- 抽象类可含构造方法,子类必须显式或隐式调用 super();接口没有构造方法,也无法被 new
- 含抽象方法的类必须声明为 abstract;但接口即使全是 default 方法,也仍是接口——它不承担“实例化父类”的职责
典型使用场景判断
- 选接口:要解耦能力(比如日志模块支持 Loggable + Exportable)、要组合多种角色(用户既是 Member 又是 Admin 还是 Notifiable)、要让无关类共享行为(ArrayList 和 LinkedList 都实现 List)
- 选抽象类:有共同字段要初始化(Animal 的 name、Shape 的 color)、有通用逻辑要复用(JDBC 中 AbstractJdbc4Connection 封装连接管理)、需要强制子类走统一构造流程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










