抽象类通过abstract关键字定义无方法体的抽象方法,强制非抽象子类实现;可含具体方法供复用;抽象方法不能是private/static/final;子类继承时须实现全部抽象方法或自身声明为abstract。

在 Java 中,抽象类通过 abstract 关键字定义抽象方法,从而强制非抽象子类必须实现该方法。只要方法声明为 abstract,且所在类也是 abstract 类,子类继承时就必须提供具体实现(除非子类也声明为 abstract)。
抽象方法的定义规则
抽象方法只有声明,没有方法体(即无花括号和实现代码),且必须用 abstract 修饰:
- 不能有方法体(不能写
{ ... }) - 不能是 private、static 或 final(这些修饰符与“被子类重写”冲突)
- 可以有访问修饰符(public、protected,默认包权限),但不能是 private
- 必须定义在 abstract 类中(接口中也可定义 abstract 方法,但那是另一机制)
抽象类中混合使用抽象与具体方法
抽象类可以同时包含抽象方法和普通(具体)方法。抽象方法用于统一契约,具体方法可提供通用逻辑供子类复用:
- 子类必须实现所有抽象方法
- 子类可选择是否重写具体方法(遵循继承规则)
- 抽象类自身不能被实例化,只能被继承
子类实现抽象方法的注意事项
当子类继承抽象类时:
- 如果子类不是 abstract 类,则必须重写父类中所有 abstract 方法
- 重写时方法签名(名称、参数列表、返回类型)必须一致,访问权限不能更严格(如父类是 protected,子类不能用 package-private)
- 若子类也声明为 abstract,则可不实现部分或全部抽象方法
一个典型示例
例如定义图形抽象类:
abstract class Shape {
public abstract double area(); // 强制子类实现面积计算
public abstract void draw(); // 强制子类实现绘制逻辑
<pre class="brush:php;toolbar:false;">// 具体方法:所有图形共有的行为
public void describe() {
System.out.println("这是一个图形");
}}
class Circle extends Shape { private double radius; public Circle(double r) { this.radius = r; }
@Override
public double area() { // 必须实现
return Math.PI * radius * radius;
}
@Override
public void draw() { // 必须实现
System.out.println("画一个圆");
}}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











