🧭 抽象类 vs 接口:本质区别全面对比
🔍 一、定义与核心思想
项目 | 抽象类(abstract class ) | 接口(interface ) |
---|
定义目标 | 提供一组具有共性行为的类的父类 | 定义行为规范/能力约定,关注“能做什么” |
抽象程度 | 部分抽象,可包含非抽象方法 | 完全抽象(Java 8 之前),只包含方法签名 |
设计哲学 | 是一种“is-a”关系 | 是一种“can-do”关系 |
举例 | 狗是动物(Dog is-a Animal) | 飞行能力(Flyable:能飞的) |
🧱 二、语法与结构对比
特性 | 抽象类 | 接口 |
---|
是否可实例化 | ❌ 不可实例化 | ❌ 不可实例化 |
是否支持构造方法 | ✅ 支持 | ❌ 不支持 |
是否可包含成员变量 | ✅ 可包含成员变量(非 final 也可) | ✅ 但只能是 public static final 常量 |
是否可包含方法实现 | ✅ 可包含普通方法 | ✅ Java 8+ 可包含 default /static 方法 |
默认修饰符 | protected 可用 | 所有方法默认 public abstract |
多继承支持 | ❌ 不支持类多继承 | ✅ 支持多接口实现 |
子类继承方式 | 使用 extends | 使用 implements |
是否可以结合使用 | ✅ 一个类可同时继承抽象类并实现接口 | ✅ 多接口组合很常见 |
📦 三、代码示例对比
🔹 抽象类使用示例:
abstract class Animal {String name;Animal(String name) {this.name = name;}void breathe() {System.out.println(name + " 在呼吸");}abstract void makeSound();
}class Dog extends Animal {Dog(String name) {super(name);}void makeSound() {System.out.println(name + " 在汪汪叫");}
}
🔸 接口使用示例:
interface Flyable {void fly();
}class Bird implements Flyable {public void fly() {System.out.println("鸟在飞翔");}
}
🧠 四、面试实战总结:选择使用谁?
使用场景 | 推荐使用 |
---|
存在共性功能和状态的类群 | 抽象类(可提供基础实现) |
为多个类提供统一能力/功能扩展 | 接口(能力型规范) |
需要支持多继承 | 接口(Java 类不支持多继承) |
需要定义一些常量 | 接口(全部 public static final ) |
📊 五、Mermaid 对比图(发散结构)

🧩 六、总结一句话:
Java 中抽象类是为具有“共性行为和属性”的类设计的,适用于继承树结构;而接口更注重“能力的约定”,适合多个无关类间提供统一行为,且支持多继承,是 Java 架构解耦的重要利器。