抽象类可定义带状态的属性字段,接口只能声明public static final常量;抽象类作为类可持有实例变量、静态变量等各类状态,接口作为契约不参与对象构建,无法保存对象独有状态。

抽象类可以定义带状态的属性字段,接口不行——这是最直接的区别。抽象类本质是“类”,能持有对象状态;接口本质是“契约”,只描述能力,不保存状态。
抽象类支持各种类型的成员变量
抽象类里的字段可以是实例变量、静态变量、常量,也可以用任意访问修饰符(private、protected、public)声明:
- 普通实例字段:比如 String name、int age,每个子类对象都可拥有独立副本
- 受保护字段:protected List
tags ,供子类安全访问和修改 - 静态可变字段:static int instanceCount,用于统计子类实例总数
- final 字段:final long createTime = System.currentTimeMillis(),初始化后不可变但非 static
接口只能声明常量
接口中所有字段自动被编译器加上 public static final 修饰,哪怕你没写,也等价于:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- int MAX_RETRY = 3; → 实际就是 public static final int MAX_RETRY = 3;
- 不能声明 private int count,也不能写 String status = "pending"(因为不是 final)
- 没有实例字段空间——接口本身不参与对象构建,自然无法承载每个对象独有的状态
为什么状态对抽象类有意义
抽象类常作为模板基类,封装共性逻辑与共享状态。例如:
- 一个 AbstractDatabaseConnection 可以持有 Connection conn 和 boolean isConnected 字段,子类复用连接管理逻辑
-
AbstractPaymentProcessor 维护 Map
context 存储本次交易上下文,避免每个实现类重复定义 - 这些字段在构造时初始化,在方法中被读写,构成可复用的状态机骨架
接口不提供状态,但可通过其他方式补充
如果需要“带状态的能力”,Java 的惯用做法是组合而非继承:
- 让实现类自己定义字段,再通过接口方法暴露行为(如 void updateStatus(String s))
- 配合策略模式或委托模式,把状态托管给单独的组件(比如 StatusHolder 类)
- Java 8+ 的默认方法虽能提供逻辑,但仍不能访问实现类的私有字段——它只是“无状态的公共行为”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










