抽象类必须用abstract class显式声明,不可实例化;可无抽象方法,但含抽象方法的类必须声明为abstract;抽象方法无方法体,不能用private/static/final修饰;抽象类可含字段、构造器、具体方法和抽象方法。

Java 中抽象类用 abstract class 声明,不是靠有没有抽象方法来判断,而是看是否加了 abstract 关键字——哪怕一个抽象方法都没有,只要写了 abstract class,它就是抽象类,就不能 new。
抽象类的声明语法和硬性规则
必须显式使用 abstract 修饰类名,且不能和 final、private 或 static 共存:
-
public abstract class Shape { ... }✅ 合法 -
final abstract class Shape { ... }❌ 编译报错:语义冲突 -
abstract class Shape { void draw() {} }✅ 合法(无抽象方法也可) -
class Shape { abstract void draw(); }❌ 编译报错:含抽象方法却没声明为 abstract 类
抽象方法怎么写才对
抽象方法是契约的最小单位,只声明不实现,语法上严格受限:
- 必须出现在 abstract 类或 interface 中
- 不能有方法体:写成
abstract void run();✅;写成abstract void run() {}或abstract void run() { return; }❌ - 不能用
private(子类不可见)、static(不依赖实例)、final(禁止重写)修饰 - 访问修饰符只能是
public或protected(默认包访问也允许,但不推荐隐式)
抽象类里还能放什么
抽象类不是“空架子”,它支持完整的类成员结构,只是多了约束:
- 可以定义普通字段(
String name;),子类继承后可直接访问或修改 - 可以写构造方法(
Animal(String name) { this.name = name; }),供子类super()调用 - 可以包含具体方法(
public void breathe() { System.out.println("呼吸中"); }),子类自动获得,无需重写 - 可以同时存在抽象方法和具体方法,形成“模板骨架 + 可变实现”的组合
常见踩坑点
这些错误编译器会立刻拦截,但容易在写快时忽略:
- 子类继承抽象类后,漏掉某个抽象方法的实现,又没把自己也标为
abstract→ 编译失败 - 把
abstract错写在方法返回类型前但漏了abstract关键字本身,比如写成void speak();→ 被当普通空方法,破坏设计意图 - 误以为抽象类能
new Animal(),实际运行时抛InstantiationError,IDE 不一定实时标红 - 在抽象类里写
abstract static void init()→ 编译器直接拒绝:illegal combination of modifiers
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











