方法一定要被重写的情况通常是在以下几种情况下:
- 实现接口: 如果一个类实现了一个接口,那么它必须重写接口中定义的所有抽象方法,否则这个类必须声明为抽象类。
interface MyInterface {
void myMethod();
}
class MyClass implements MyInterface {
@Override
public void myMethod() {
// 必须提供具体实现
}
}
- 继承抽象类: 如果一个类继承了一个抽象类,那么它必须实现抽象类中所有未实现的抽象方法,除非它自己也声明为抽象类。
abstract class MyAbstractClass {
abstract void myMethod();
}
class MyClass extends MyAbstractClass {
@Override
void myMethod() {
// 必须提供具体实现
}
}
- 覆盖父类方法: 如果一个子类继承了一个父类,并且子类想要改变或者扩展父类的方法行为,就需要覆盖(重写)父类的方法。
class Parent {
void method() {
// 父类方法实现
}
}
class Child extends Parent {
@Override
void method() {
// 子类提供新的实现或者扩展父类方法
}
}
- 实现接口的默认方法: 如果一个类实现了一个接口,并且这个接口提供了默认方法(Java 8+ 新特性),那么类可以选择是否重写这个默认方法。
interface MyInterface {
default void myMethod() {
// 接口中的默认方法
}
}
class MyClass implements MyInterface {
// 可以选择重写默认方法
@Override
public void myMethod() {
// 提供新的实现或者覆盖默认方法
}
}
总之,方法一定要被重写的情况是由类的继承关系或者接口实现关系决定的。在上述情况中,编译器会强制要求你提供方法的具体实现,以确保类在使用时具有正确的行为。