在Java中,子类可以选择性重写父类方法,具体规则和实现方式如下:
1. 必须重写的情况
- 父类方法是抽象方法(
abstract
修饰):子类必须实现所有抽象方法,除非子类本身也是抽象类。 - 接口中的方法:实现接口的类必须重写所有接口方法(除非是抽象类)。
2. 可选重写的情况
- 父类方法是普通实例方法(非
final
、非static
):子类可根据需求选择是否重写。若不重写,则直接继承父类实现。 - 父类方法是虚方法(
virtual
,即非final
的实例方法):子类可通过@Override
重写,提供新实现。
3. 不能重写的情况
-
final
方法:父类中标记为final
的方法禁止重写。 -
static
方法:静态方法属于类而非实例,子类可定义同名静态方法,但属于“隐藏”而非重写。 -
private
方法:子类无法访问父类私有方法,因此不能重写。
4. 重写的规则
- 方法签名一致:方法名、参数列表必须与父类方法完全相同。
- 访问权限不缩小:子类方法的访问修饰符(如
public
)不能比父类更严格(如父类为protected
,子类可为protected
或public
)。 - 返回值类型协变:子类方法的返回值可以是父类方法返回类型的子类(仅限引用类型)。
- 异常不扩大:子类方法抛出的异常不能比父类方法更宽泛。
5. 选择性重写的应用场景
- 扩展功能:子类重写方法并调用
super.method()
保留父类逻辑,同时新增功能。
示例:class Parent {
void show() { System.out.println("Parent"); }
}
class Child extends Parent {
@Override
void show() {
super.show(); // 调用父类方法
System.out.println("Child"); // 新增逻辑
}
} - 完全覆盖:子类完全重写父类方法,不调用
super
。
6. 注意事项
-
@Override
注解:推荐使用,编译器会检查是否满足重写条件。 - 构造方法:不能重写,但可通过
super()
调用父类构造方法。