一、抽象类核心概念抽象类是一种不能被实例化的类用于定义一种抽象的概念通常作为其他类的基类。基本特征使用abstract关键字修饰不能通过new关键字直接创建对象可以包含抽象方法没有方法体和具体方法可以有构造器供子类调用可以有成员变量、常量、静态方法等二、抽象方法1. 抽象方法的规则public abstract class Animal { // ✅ 正确抽象方法没有方法体以分号结束 public abstract void makeSound(); // ❌ 错误抽象方法不能有方法体 // public abstract void eat() { } // ✅ 正确可以有具体方法 public void sleep() { System.out.println(睡觉中...); } }2. 子类必须实现抽象方法除非子类也是抽象类public class Dog extends Animal { // ✅ 必须实现父类的抽象方法 Override public void makeSound() { System.out.println(汪汪汪); } } // 如果子类也是抽象类可以不实现 public abstract class Cat extends Animal { // 可以不实现 makeSound() public abstract void scratch(); }三、易错点易错点 1抽象类不能实例化但可以有构造器很多初学者会困惑既然不能实例化为什么还要构造器原因构造器是给子类调用的用于初始化父类的成员变量。public abstract class Person { private String name; private int age; // ✅ 抽象类可以有构造器 public Person(String name, int age) { this.name name; this.age age; System.out.println(Person构造器执行); } public abstract void work(); public void introduce() { System.out.println(我叫 name 今年 age 岁); } } public class Student extends Person { private String school; public Student(String name, int age, String school) { super(name, age); // ✅ 必须调用父类构造器 this.school school; } Override public void work() { System.out.println(我在 school 学习); } } // 使用 public class Test { public static void main(String[] args) { // Person p new Person(); // ❌ 编译错误不能实例化抽象类 Student s new Student(张三, 18, 北京大学); s.introduce(); // 输出我叫张三今年18岁 s.work(); // 输出我在北京大学学习 } }易错点 2abstract 和 final 不能同时使用// ❌ 错误abstract 和 final 互斥 // public abstract final class Test { } // ❌ 错误抽象方法不能是 final public abstract class Animal { // public abstract final void move(); // 编译错误 }原因abstract表示需要子类继承/实现final表示不能被继承/重写两者语义矛盾易错点 3abstract 不能与 static、private、native 同时修饰方法public abstract class Demo { // ❌ 错误static 方法不能被重写与 abstract 矛盾 // public abstract static void method1(); // ❌ 错误private 方法子类无法访问无法重写 // private abstract void method2(); // ✅ 正确protected 或 public 可以 protected abstract void method3(); public abstract void method4(); }易错点 4抽象类可以没有抽象方法// ✅ 这是一个没有抽象方法的抽象类 public abstract class Utility { public static void printLog(String msg) { System.out.println([LOG] msg); } public void commonMethod() { System.out.println(通用方法); } } // 但仍然不能实例化 // Utility u new Utility(); // ❌ 错误用途防止该类被实例化强制作为基类使用。易错点 5抽象类可以实现接口但不强制实现接口方法interface Flyable { void fly(); void land(); } // ✅ 抽象类可以不实现接口的所有方法 public abstract class Bird implements Flyable { // 只实现了 flyland 留给子类实现 Override public void fly() { System.out.println(鸟在飞); } // 可以添加自己的抽象方法 public abstract void buildNest(); } // 具体子类必须实现所有未实现的方法 public class Sparrow extends Bird { Override public void land() { // 必须实现 land System.out.println(麻雀降落); } Override public void buildNest() { // 必须实现 buildNest System.out.println(麻雀筑巢); } }为什Sparrow没有实现fly// 接口定义了 fly() 方法 interface Flyable { void fly(); // 抽象方法 void land(); // 抽象方法 } // 抽象类 Bird 实现了 fly() public abstract class Bird implements Flyable { Override public void fly() { // ✅ 已经提供了 fly() 的实现 System.out.println(鸟在飞); } public abstract void buildNest(); } // 子类 Sparrow 继承自 Bird public class Sparrow extends Bird { // 不需要实现 fly()因为已经从 Bird 继承了实现 Override public void land() { // 必须实现Bird 没实现 land() System.out.println(麻雀降落); } Override public void buildNest() { // 必须实现Bird 是抽象的 System.out.println(麻雀筑巢); } }Flyable 接口├── fly() [抽象]└── land() [抽象]↓实现 (implements)↓Bird 抽象类├── fly() [已实现] ✅├── land() [未实现] ❌└── buildNest() [新增抽象方法]↓继承 (extends)↓Sparrow 具体类├── fly() [从 Bird 继承] ✅ 已有实现├── land() [必须自己实现] ⚠️└── buildNest() [必须自己实现] ⚠️1. 继承会传递实现public class Sparrow extends Bird { // Sparrow 自动拥有 Bird 的所有非 private 成员 // 包括已经实现的 fly() 方法 } // 测试 public class Test { public static void main(String[] args) { Sparrow sparrow new Sparrow(); sparrow.fly(); // ✅ 可以直接调用输出鸟在飞 // 这个方法是从 Bird 继承来的不需要重写 } }2. 如果子类想改变行为可以重写public class Sparrow extends Bird { Override public void fly() { // 可选重写父类实现 System.out.println(麻雀快速扇动翅膀飞行); } // ... 其他方法 }抽象类可以部分实现接口方法- 不需要实现所有接口方法子类继承父类的所有实现- 包括父类已实现的接口方法子类只需实现父类未实现的接口方法父类中定义的抽象方法已经实现的方法可以直接使用不重写选择性重写override易错点 6抽象类的静态方法可以直接调用public abstract class Config { public static final String VERSION 1.0; public static void showVersion() { System.out.println(版本 VERSION); } public abstract void load(); } // 使用 public class Test { public static void main(String[] args) { // ✅ 静态方法可以直接调用无需实例化 Config.showVersion(); // 输出版本1.0 System.out.println(Config.VERSION); } }四、抽象类 vs 接口对比项抽象类接口实例化不能不能类修饰符public、默认public、默认成员变量任意类型、任意修饰符只能是public static final构造器✅ 可以有❌ 不能有抽象方法修饰符public、protected、默认public默认具体方法类型所有类型普通、static、final等default、static、privateJava 9具体方法修饰符任意public、privateJava 9继承/实现单继承多实现设计目的代码复用、定义公共基础定义契约、行为规范实现指的是提供方法体针对方法变量不存在实现的概念只有初始化和使用