Skip to content

抽象类与接口


抽象类(Abstract Class)

一、是什么?

抽象类是用 abstract 关键字修饰的类,不能直接实例化。它可以包含抽象方法(无实现)和具体方法(有实现),也可以定义成员变量和构造方法。

java
public abstract class Animal {
    private String name;  // 成员变量
    public Animal(String name) { this.name = name; }  // 构造方法
    public abstract void makeSound();  // 抽象方法
    public void sleep() {  // 具体方法
        System.out.println(name + " is sleeping.");
    }
}

二、解决什么问题

  1. 代码复用:通过具体方法提供通用逻辑,子类可直接继承。
  2. 规范与扩展:强制子类实现抽象方法,确保多态性。
  3. 封装共性:将多个子类的共同属性和行为集中管理(如动物都有 name 属性和 sleep() 行为)。

三、核心方法

  • 抽象方法public abstract void method();(无方法体)。
  • 具体方法:普通方法(含实现)。
  • 构造方法:用于初始化成员变量(子类通过 super() 调用)。

四、应用场景

  1. 多个相关类共享相同属性和行为(如 DogCat 继承 Animal)。
  2. 需要部分方法实现,部分方法由子类自定义(如模板方法模式)。
  3. 需要定义非静态、非final的成员变量(如动物名称 name)。

接口(Interface)

一、是什么?

接口是用 interface 关键字定义的行为规范。JDK 8 前只能包含抽象方法,之后支持默认方法(default)和静态方法(static)。

java
public interface Swimmable {
    void swim();  // 抽象方法(默认 public abstract)
    default void floatOnWater() {  // JDK8 默认方法
        System.out.println("Floating...");
    }
    static boolean isWaterSafe() {  // JDK8 静态方法
        return checkWaterQuality();
    }
}

二、解决什么问题

  1. 行为解耦:定义标准行为,实现类必须遵守(如 Swimmable 要求实现 swim())。
  2. 多继承替代:Java 不支持多继承,但类可实现多个接口。
  3. 扩展性:JDK8 的默认方法允许接口新增功能而不破坏现有实现。

三、核心方法(JDK8+)

  • 抽象方法void method();(隐式 public abstract)。
  • 默认方法default void method() {...}(提供默认实现)。
  • 静态方法static void helper() {...}(通过接口名调用)。
  • 私有方法:JDK9 支持 private void internalLogic() {...}(接口内部复用代码)。

四、应用场景

  1. 定义跨继承体系的行为(如 Swimmable 可被 FishHuman 实现)。
  2. 需要多继承的场景(如一个类同时实现 RunnableSerializable)。
  3. 为现有接口添加新功能(通过默认方法避免修改所有实现类)。

抽象类 vs 接口的区别

特性抽象类接口
实例化❌ 不能直接实例化❌ 不能实例化
方法类型抽象方法 + 具体方法JDK8前:只有抽象方法
JDK8+:抽象+默认+静态+私有方法
成员变量可以是任意类型(非final)默认 public static final(常量)
构造方法✅ 有❌ 无
继承机制单继承(一个子类只能继承一个)多实现(一个类可实现多个接口)
设计目的代码复用 + 扩展规范行为契约 + 解耦
典型应用“is-a”关系(如 Dog is an Animal“can-do”能力(如 CanSwim

重要注意事项

  1. 抽象类
    • 子类必须实现所有抽象方法(除非子类也是抽象类)。
    • 成员变量不强制final
  2. 接口
    • 方法默认 public,成员变量默认 public static final
    • JDK8 的默认方法可被实现类重写,静态方法通过接口名调用(如 Swimmable.isWaterSafe())。
    • 避免默认方法冲突:若实现多个含同名默认方法的接口,需在类中重写该方法。

总结

场景推荐选择
需要共享代码(属性/方法)✅ 抽象类
定义行为规范(多实现)✅ 接口
需要多继承✅ 接口(多实现)
需要构造方法初始化状态✅ 抽象类
扩展JDK库功能(如集合类)✅ 接口(默认方法)

实际应用

  • 抽象类:GUI 的 BaseDialog(含通用渲染逻辑)。
  • 接口:Comparable(排序)、Runnable(多线程)、Stream(函数式编程)。

JDK8+ 关键革新:接口通过默认方法实现“向后兼容”,使集合框架等核心库能平滑演进(如 List 新增 stream() 方法)。