abstract关键字本质是编译期强制契约:抽象类不可实例化,抽象方法必须由非抽象子类实现;声明时在class前加abstract即可,即使无抽象方法;抽象方法无方法体、不能用private/static/final修饰,子类须全部重写或自身声明为abstract。

Java 中用 abstract 关键字定义抽象类和抽象方法,本质是建立一种编译期强制契约:抽象类不能被 new,抽象方法必须由非抽象子类实现。
怎么声明抽象类
在 class 前加 abstract 即可,不需要类里有抽象方法:
- 即使类中全是具体方法,只要加了
abstract,就不能实例化 - 可以包含字段、构造器、普通方法(带实现)和抽象方法
- 构造器不是用来创建自身对象的,而是供子类通过
super()调用,初始化共享状态 - 例如:
abstract class Animal { String name; Animal(String name) { this.name = name; } }
怎么定义抽象方法
抽象方法只有声明,没有实现体,必须写在抽象类中:
- 语法上以分号结尾,不能有
{}或return - 不能用
private、static、final修饰(与“被子类重写”语义冲突) - 合法修饰符是
public、protected或默认(包级私有) - 例如:
public abstract void makeSound();✅abstract void makeSound() { }❌(编译报错)
子类继承时的两种选择
子类用 extends 继承抽象类后,必须明确处理所有抽象方法:
- 全部重写抽象方法 → 子类成为具体类,可以
new - 不全部实现 → 子类也必须加
abstract声明,继续传递契约 - 重写时访问权限不能比父类更严格(如父类
public,子类不能写protected) - 遗漏任一抽象方法且未声明为
abstract,编译直接报错
和接口的关键区别
抽象类侧重“是什么”,接口侧重“能做什么”:
- 一个类只能
extends一个抽象类,但可implements多个接口 - 抽象类可含构造器、普通字段、各种访问级别的成员;接口中字段默认
public static final,方法默认public abstract(Java 8+ 可有default或static) - 适合共享状态或基础逻辑时用抽象类;定义能力契约或解耦行为时优先考虑接口
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











