抽象类与接口区别
面试官问:"抽象类和接口有什么区别?"
候选人小沈答:"抽象类可以有方法实现,接口在 JDK 8 之前不能有实现。"
面试官点点头:"JDK 8 之后呢?"
小沈说:"JDK 8 可以有默认方法了。"
面试官追问:"那抽象类和接口还有什么区别?"
小沈:"...抽象类只能单继承,接口可以多实现。"
面试官:"就这些吗?"
小沈说不出来了。
【面试官心理】 这道题考查的是候选人对 Java 面向对象设计哲学的理解深度。JDK 8 之后接口增加了 default 方法和 static 方法,两者的界限已经模糊了。能说出"抽象类代表'是什么'(is-a),接口代表'能做什么'(can-do)"的候选人,是真正理解设计意图的。
一、JDK 8 前后的对比表 🔴
二、设计意图的差异 🔴
2.1 抽象类:is-a 关系
抽象类表示"是什么"——强调共性和本质。所有 Dog 都是 Animal,共享 breathe() 这种通用行为。
2.2 接口:can-do 关系
接口表示"能做什么"——强调能力和行为契约。Duck 可以同时具备多种能力。
2.3 何时选择抽象类 vs 接口
三、JDK 8 接口的新特性 🔴
3.1 默认方法(default methods)
3.2 默认方法的多继承冲突
3.3 静态方法
3.4 JDK 9 的私有方法
四、最佳实践 🔴
4.1 模板方法模式
4.2 接口组合
五、追问升级
面试官:"JDK 8 之后接口和抽象类还有什么本质区别?"
面试官:"Comparator 接口为什么有很多 default 方法?"
原因:接口组合。Comparator 需要 reversed()、thenComparing() 等组合操作,这些用 default 方法实现最合适——既不用强制实现类提供,又提供了便利的链式调用能力。
【面试官心理】 能说出接口 default 方法设计意图的候选人,说明对 Java 8 特性有深入理解。这也是 API 设计能力的体现。