抽象类与接口:多继承的边界、default 方法与函数式接口
大约 2 分钟
抽象类与接口:多继承的边界、default 方法与函数式接口
新手先看 · 一屏速览
- 抽象类用于共享“状态 + 部分实现”;接口用于定义“能力与契约”
- 多接口可多继承,冲突时需显式指定实现;default 方法让接口可演进
- 函数式接口(@FunctionalInterface)是 Lambda 的基础
1. 抽象类 vs 接口:差异与选型
- 抽象类:可包含字段、构造方法与非抽象方法;单继承
- 接口:只定义行为契约;可有 default/static 方法;多继承
- 选型建议:共享状态与骨架 → 抽象类;仅定义能力/扩展点 → 接口
2. default 方法与冲突解析
interface A { default String hi(){ return "A"; } }
interface B { default String hi(){ return "B"; } }
class C implements A, B {
@Override public String hi(){ return A.super.hi(); }
}- 多继承冲突需在实现类中显式选择或重写
- default 方法的意义:接口可向后兼容地增加方法而不破坏实现
3. 函数式接口与 Lambda
@FunctionalInterface
interface Mapper<T,R> { R map(T t); }
Mapper<String,Integer> len = s -> s.length();- 函数式接口:只有一个抽象方法(SAM),是 Lambda 的目标类型
- 方法引用:
String::length、Integer::parseInt
4. 策略模式与扩展点
最近建一些几十个工作内推群,各大城市都有,群里目前已经收集了很多内推岗位,大厂、中厂、小厂、外包都有。 欢迎HR、开发、测试、运维和产品加入。

扫描下方微信,备注:网站+所在城市,即可拉你进工作内推群。

interface Formatter { String format(String s); }
class Lower implements Formatter { public String format(String s){ return s.toLowerCase(); } }
class Upper implements Formatter { public String format(String s){ return s.toUpperCase(); } }- 在组合与依赖注入下,策略切换无需修改调用方,提高扩展性
5. 抽象类的骨架实现
abstract class Template {
public final String process(String s){ pre(); String r = doBiz(s); post(); return r; }
protected void pre(){}
protected abstract String doBiz(String s);
protected void post(){}
}- 模板方法模式:固化流程骨架,留钩子给子类定制
6. 实战清单与反模式
- 清单:接口定义能力与契约;冲突显式决策;default 谨慎使用;函数式接口命名清晰
- 反模式:接口滥用常量;抽象类承担过多状态;default 方法藏复杂逻辑
7. 练习
- 为某业务设计接口+策略实现,新增策略不改调用方
- 为现有类抽象出模板方法骨架,减少重复流程代码
