抽象方法必须在抽象类中声明且无方法体,仅定义行为不实现逻辑;含抽象方法的类必须为abstract类,而抽象类可无抽象方法;抽象方法不可与private、static、final共存,访问权限限public或protected,语法以分号结尾。

抽象方法必须在抽象类中声明,且不能有方法体——这是 Java 的硬性语法要求。它只定义“做什么”,不关心“怎么做”,把具体实现留给子类。
声明位置和前提条件
抽象方法只能出现在用 abstract class 声明的类中。普通类里写 abstract void method(); 会直接编译失败。
- 如果一个类里有至少一个抽象方法,这个类就必须加
abstract修饰符 - 反过来,抽象类可以没有抽象方法(比如只做模板约束或提供通用逻辑)
- 抽象类本身不能被
new实例化,哪怕它所有方法都是具体的
语法格式和关键细节
抽象方法的写法非常严格,漏掉任何一点都会报错:
- 必须用
abstract修饰,且不能和private、static、final共存 - 访问权限只能是
public或protected(默认public),不可private - 方法签名后直接跟分号
;,绝对不能写{}、return、抛异常语句,哪怕空实现也不行 - 示例正确写法:
public abstract String getName();或abstract void save();
常见错误写法及后果
这些写法看似接近,但全部通不过编译:
-
private abstract void init();→ 编译报错:“illegal combination of modifiers” -
public abstract void load() {}→ 报错:“abstract methods cannot have a body” -
abstract static void reset();→ 报错:static 和 abstract 冲突 -
abstract final void close();→ 报错:final 禁止重写,与抽象目标矛盾
子类继承时的处理规则
非抽象子类继承抽象类后,必须覆盖所有抽象方法:
- 方法名、参数列表、返回类型(支持协变)必须一致
- 访问权限不能比父类更严格(比如父类是
protected,子类不能写private) - 可抛出的异常类型不能比父类声明的范围更宽
- 若子类不想立即实现,可声明为
abstract class Sub extends Parent,继续向下传递契约










