好的阿杰 👍
我来给你写一份 Java 抽象类(abstract class)详解,从概念、语法、应用到与接口的对比,帮你彻底掌握。


🟦 Java 抽象类详解

1️⃣ 什么是抽象类?

  • 抽象类是一种 不能被实例化 的类,用来作为父类,定义通用的属性和方法。
  • 里面可以包含 抽象方法(没有方法体的方法),要求子类必须实现。

👉 通俗理解:
抽象类就像一张 设计图纸,规定了要造什么东西,但具体怎么造要交给子类去完成。


2️⃣ 抽象类的基本语法

abstract class Animal {
    // 抽象方法(没有方法体)
    public abstract void makeSound();

    // 普通方法
    public void sleep() {
        System.out.println("动物在睡觉");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("汪汪汪!");
    }
}

public class TestAbstract {
    public static void main(String[] args) {
        Animal dog = new Dog(); // 多态
        dog.makeSound();        // 汪汪汪!
        dog.sleep();            // 动物在睡觉
    }
}


3️⃣ 抽象类的特点

  1. 不能被实例化new Animal()
  2. 可以有构造方法:虽然不能直接实例化,但子类构造时会调用父类构造方法。
  3. 可以有普通方法和抽象方法
  4. 子类必须实现抽象方法,除非子类也是抽象类。
  5. 可以有成员变量,不像接口只能是常量。

4️⃣ 抽象方法

  • 只能存在于抽象类中。
  • 没有方法体,用 abstract 修饰。
  • 子类必须实现。
abstract class Shape {
    public abstract double area(); // 抽象方法
}


5️⃣ 抽象类 vs 接口

对比点抽象类接口
继承/实现只能单继承支持多实现
变量可以有各种变量只能 public static final
方法抽象方法 + 普通方法抽象方法 + 默认方法 + 静态方法
构造方法✅ 可以有❌ 没有
设计目的代码复用 + 统一规范定义规范/契约

👉 一句话记忆:

  • 接口更偏向定义规范(“能做什么”)。
  • 抽象类更偏向模板(“有一些默认实现 + 要补充实现”)。

6️⃣ 抽象类应用场景

  1. 模板方法模式:定义算法骨架,具体步骤由子类实现。
  2. 父类提取:把多个子类的公共属性和方法放到抽象类里,提高复用性。
  3. 半成品类:部分方法先写好,部分留给子类实现。

示例(模板方法模式):

abstract class Game {
    public abstract void init();
    public abstract void start();
    public abstract void end();

    // 模板方法
    public final void play() {
        init();
        start();
        end();
    }
}

class Basketball extends Game {
    public void init() { System.out.println("篮球准备"); }
    public void start() { System.out.println("篮球开始"); }
    public void end() { System.out.println("篮球结束"); }
}


📝 总结

  • 抽象类用 abstract 修饰,不能实例化
  • 可以有 抽象方法和普通方法
  • 子类必须实现抽象方法,除非子类也是抽象类。
  • 适合用来做 模板/父类提取/框架设计
  • 区别于接口:抽象类偏向 模板复用,接口偏向 行为规范