抽象方法必须定义在抽象类中,用abstract修饰、无方法体、以分号结尾;含抽象方法的类必为抽象类,抽象类可无抽象方法;不可用private/static/final修饰,访问权限不能为private;是明确的业务契约,子类须全部实现或声明为抽象类。

Java 中定义没有方法体的抽象方法,必须放在抽象类里,并用 abstract 关键字修饰,结尾用分号结束,不能写大括号 {},也不能写 return 或抛异常。
抽象类和抽象方法必须配套声明
只要类里有一个抽象方法,这个类就必须用 abstract 修饰,变成抽象类;反过来,抽象类可以没有抽象方法,但一旦有,就强制要求类本身也得是 abstract。
- 正确写法:
public abstract void validate(); - 错误写法:
public abstract void validate() {}(编译报错:abstract methods cannot have a body) - 错误写法:
public abstract String getName() { return null; }(哪怕只写一行 return,也不合法)
抽象方法不能加 private、static、final
这些修饰符和“强制子类重写”的语义冲突:
- private → 子类看不见,无法重写
- static → 属于类,不参与多态,和“留给子类实现”矛盾
- final → 禁止重写,直接违背抽象方法的设计目的
默认访问权限是 public,也可以显式写成 protected,但不能是 private。
立即学习“Java免费学习笔记(深入)”;
抽象方法是业务契约,不是空实现占位
它不是为了“先占个位置以后再补”,而是明确告诉子类:“你必须提供这个行为的具体逻辑”。比如:
public abstract boolean checkInventory();public abstract BigDecimal calculateDiscount();
名字要体现业务含义,避免 doSomething() 这类模糊命名。这样编译器能在编译期检查是否遗漏实现,比运行时抛 UnsupportedOperationException 更安全。
子类继承后必须全部实现,或继续声明为抽象类
非抽象子类如果没重写完所有抽象方法,编译直接失败。例如:
- 父类有
validate()和process()两个抽象方法 - 子类只重写了
validate(),没碰process()→ 编译报错 - 解决办法:要么补全实现,要么把子类也声明为
abstract class SubService


















