抽象方法必须由非抽象子类重写,否则编译失败;抽象子类可不实现。重写须满足“4同1不低”:方法名、参数列表、返回类型(含协变)、异常声明相同或更窄,访问权限不更低。

抽象方法必须在子类中被重写,前提是子类不是抽象类。这是 Java 强制要求的规则,不是可选项。
子类重写抽象方法的前提条件
只有当子类是普通(非抽象)类时,才必须重写父类中所有的抽象方法。如果子类也声明为 abstract,那么它可以不实现这些抽象方法,留给更下层的子类去完成。
- 抽象类不能被实例化,所以它的抽象方法需要由具体子类来落实
- 编译器会检查:非抽象子类若未重写全部抽象方法,直接报错,无法通过编译
- 重写时不需要加 @Override 注解(但强烈建议加上,提高可读性和编译期校验)
重写的语法和规范
重写抽象方法和重写普通方法一样,需满足“4同1不低”原则:
- 方法名相同
- 参数列表完全一致(个数、类型、顺序)
- 返回值类型相同,或为父类返回类型的子类型(协变返回)
- 异常声明不能比父类更宽(只能抛出更具体的异常,或不抛)
- 访问权限不能比父类更严格(例如父类是 public,子类不能写 protected)
典型代码示例
父类定义抽象方法:
public abstract class Animal {public abstract void eat();
}
子类实现该方法:
public class Dog extends Animal {@Override
public void eat() {
System.out.println("狗啃骨头");
}
}
注意:不能省略 public——因为抽象方法默认是 public,子类重写时访问修饰符不能更低。
常见错误提醒
- 忘记重写,编译失败:“Dog is not abstract and does not override abstract method eat()”
- 写了方法但签名不对(比如参数类型不同),那不是重写而是重载,仍会编译报错
- 用 private 或 protected 修饰重写方法,违反权限规则
- 在抽象子类中“假装重写”,实则只是继承了抽象方法,未提供方法体
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











