目录一、核心概念简述二、接口与抽象类全方位对比表面试必背三、核心特性代码实战演示3.1 抽象类代码演示3.2 接口代码演示兼容 JDK8 全特性3.3 单继承 vs 多实现 核心区别演示四、变量权限核心坑点实战五、业务场景选型开发必看5.1 优先使用接口的场景5.2 优先使用抽象类的场景六、面试极简背诵总结七、文末小结在 Java 面向对象进阶体系中抽象类Abstract Class和接口Interface都是用来定义“规范、模板、行为”都无法直接实例化都可以包含抽象方法。但二者在继承机制、成员变量、方法权限、构造方法、设计思想、业务场景上有着本质区别是 Java 面试最高频、也是架构设计最核心的考点。很多开发者工作多年依然分不清什么时候用抽象类、什么时候用接口。本文结合JDK8、JDK9 新版本特性、完整可运行代码、实战场景彻底吃透二者区别。一、核心概念简述抽象类是对事物本身的抽象抽取同类对象的公共属性和公共行为用于模板复用、代码复用。接口是对行为能力的抽象定义一套行为规范只规定“能做什么”不关心“怎么做”用于解耦、多态、规范约束。二、接口与抽象类全方位对比表面试必背对比维度接口Interface抽象类Abstract Class继承实现机制多实现一个类可以 implement 多个接口单继承一个类只能 extends 一个抽象类成员变量只能是public static final常量不可修改普通变量、静态变量、常量都可以定义成员方法JDK8前仅抽象方法JDK8抽象方法 default默认方法 static静态方法JDK9新增 private 私有方法任意组合抽象方法、普通实例方法、静态方法、私有方法构造方法无构造方法有构造方法供子类 super 调用自身不能实例化设计思想行为规范、能力约束、模块解耦模板抽取、公共代码复用、统一父类结构典型案例Runnable、List、SerializableHttpServlet、AbstractList、AbstractMap三、核心特性代码实战演示3.1 抽象类代码演示抽象类可以拥有普通属性、常量、抽象方法、普通方法、构造方法支持单继承。// 抽象类 abstract class Animal { // 普通成员变量 public String name; // 常量 public static final String TYPE 动物; // 构造方法供子类调用 public Animal(String name) { this.name name; } // 抽象方法子类必须实现 public abstract void cry(); // 普通方法代码复用 public void sleep() { System.out.println(name 正在睡觉); } } // 子类继承抽象类只能单继承 class Cat extends Animal { public Cat(String name) { super(name); } Override public void cry() { System.out.println(name 喵喵喵); } } public class AbstractTest { public static void main(String[] args) { Cat cat new Cat(小猫); cat.cry(); cat.sleep(); } }特点抽象类重在模板复用子类可以直接复用父类普通方法。3.2 接口代码演示兼容 JDK8 全特性接口只能是常量拥有抽象方法、默认方法、静态方法、私有方法支持多实现。// 定义行为接口 interface Runable { // 默认public static final 常量 String DESC 奔跑能力; // 抽象方法必须被实现 void run(); // JDK8 默认方法有默认实现子类可重写可不重写 default void info() { System.out.println(具备奔跑能力); } // JDK8 静态方法接口直接调用 static void staticMethod() { System.out.println(接口静态方法); } // JDK9 私有方法内部复用对外隐藏 private void privateMethod() { System.out.println(接口私有方法); } } // 多实现一个类可以实现多个接口 interface Swimable{} class Dog implements Runable, Swimable { Override public void run() { System.out.println(小狗快速奔跑); } } public class InterfaceTest { public static void main(String[] args) { Dog dog new Dog(); dog.run(); dog.info(); Runable.staticMethod(); } }特点接口重在行为规范只定义能力不强制复用代码。3.3 单继承 vs 多实现 核心区别演示// 抽象类只能单继承 // class A extends Animal, Cat {} 编译报错 // 接口可以多实现 class Test implements Runable, Swimable {}四、变量权限核心坑点实战接口变量默认全部是常量无法二次赋值抽象类变量可自由修改。interface TestInterface{ String MSG hello; // 默认 public static final } abstract class TestAbstract{ public String msg hello; } public class VarTest { public static void main(String[] args) { // TestInterface.MSG test; 编译报错常量不可修改 TestAbstract a new TestAbstract(){}; a.msg test; // 正常修改 System.out.println(a.msg); } }五、业务场景选型开发必看5.1 优先使用接口的场景1. 用于定义行为规范、能力标准2. 不同类、无继承关系的类拥有相同行为Runnable、序列化、读写能力3. 需要多实现、解耦、拓展的场景4. 日常架构设计面向接口编程、屏蔽实现细节。5.2 优先使用抽象类的场景1. 多个子类属于同一类事物存在大量公共代码2. 需要抽取公共字段、公共逻辑、统一模板3. 需要控制子类模板流程模板方法模式4. 需要定义构造方法、成员变量的场景。六、面试极简背诵总结1. 继承区别抽象类单继承接口多实现2. 变量区别接口只有常量抽象类支持任意变量3. 方法区别接口 JDK8/9 迭代新增默认、静态、私有方法抽象类方法无限制4. 构造方法接口无构造方法抽象类有构造方法5. 设计思想抽象类做模板复用接口做行为规范和解耦。七、文末小结抽象类和接口的本质区别抽象类是“是什么”归属模板接口是“能什么”行为能力。日常开发遵循尽量使用接口解耦公共代码复用使用抽象类。吃透二者区别不仅能搞定面试更是掌握面向对象设计、模板模式、接口隔离原则的核心基础。