Java 接口和抽象类到底怎么选?

发布时间:2026/7/26 16:05:22

Java 接口和抽象类到底怎么选? 选择接口或抽象取决于你想解决什么问题定义“你能做什么”使用接口提供“如何做基本模板”使用抽象。接口适合定义行为合同界面描述的是能力不在乎实现细节。例如List、Runnable、Comparable他们只说“你可以排序”“你可以运行”“你支持遍历”不指定怎么排序怎么跑怎么遍历。一个类可以实现多个接口自然支持多行为组合(例如一个类可以序列化和比较)接口方法默认为public abstract字段默认为public static finalJDK 8 之后可以添加default和static但仍然是为了扩展服务而不是为了包装共享逻辑抽象适合共享代码骨架当你有一组子类时它们有大量的通用逻辑如初始化、验证、模板过程但有些步骤是不同的应该使用抽象类。抽象类可以有结构器、普通字段、protected方法、静态方法甚至具体实现方法子类继承它自动获得重用代码只需重写抽象方法或选择性地覆盖现有方法例如Httpservlet提供service()主流程子类只写doget()或dopost()现实项目经常一起使用大框架中常见的“接口” 抽象实现类的组合。接口对外承诺能力抽象对内沉淀的一般实现为特定子类留下最小的定制成本。比如 Spring Applicationrunner(接口)和commandlinerunner(接口)可以在实际开发中直接实现也可以基于Abstractcomandhandler等抽象基类快速启动设计自己的模块时先想清楚:这个东西以后会被谁用是扩展给别人还是在自己的团队内部重用前者优先接口后者抽象更容易几个简单的判断线索如果不准时快速通过这些问题:要不要强迫子类执行一个初始化过程→ 使用抽象类(接口做不到)希望很多不相关的类别都能有同样的能力吗(比如String和Localdatetime都支持格式化)→ 用接口非静态字段是否需要被子共享→ 抽象只能使用未来可能会增加新的方法不想破坏所有的实现→ default接口更安全基本上就是这样。这并不复杂但很容易忽略设计意图——界面是“协议”抽象是“半成品”。如果你想知道你想建造的是合同还是脚手架答案自然会出来。

相关新闻