- 方法名称和参数列表必须与父类被重写的方法相同。
- 返回值类型不能大于父类被重写的方法的返回值类型(除非是基本数据类型或void,必须相同)。
- 访问权限不能小于父类被重写的方法的访问权限(public > protected > 缺省 > private)。
- 子类方法抛出的异常不能大于父类被重写方法的异常。
当谈到方法重写的要求时,以下是一些具体的示例说明:
方法名称和参数列表必须相同
:
class Animal {
public void eat(String food) {
System.out.println("Animal is eating " + food);
}
}
class Dog extends Animal {
// 正确的方法重写,方法名称和参数列表与父类相同
@Override
public void eat(String food) {
System.out.println("Dog is eating " + food);
}
}
返回值类型不能大于父类被重写的方法的返回值类型
:
class Shape {
public Object draw() {
System.out.println("Drawing a shape");
return new Object();
}
}
class Circle extends Shape {
// 错误的方法重写,返回值类型是Shape,不能大于父类方法的返回值类型Object
@Override
public Shape draw() {
System.out.println("Drawing a circle");
return new Circle();
}
}
访问权限不能小于父类被重写的方法的访问权限
:
class Animal {
protected void makeSound() {
System.out.println("Animal is making sound");
}
}
class Cat extends Animal {
// 正确的方法重写,访问权限为protected,不小于父类方法的访问权限
@Override
protected void makeSound() {
System.out.println("Cat is making sound");
}
}
子类方法抛出的异常不能大于父类被重写方法的异常
:
import java.io.IOException;
class Animal {
public void sleep() throws IOException {
System.out.println("Animal is sleeping");
}
}
class Cat extends Animal {
// 错误的方法重写,抛出的异常大于父类方法的异常
@Override
public void sleep() throws Exception {
System.out.println("Cat is sleeping");
}
}
这些示例说明了方法重写的要求,包括方法名称、参数列表、返回值类型、访问权限和异常的一致性。通过遵守这些要求,子类可以成功重写父类的方法,并实现自定义的行为。
请注意,父类的私有方法不能被重写,而且跨包的父类缺省方法也不能被重写。这是因为私有方法对子类不可见,而跨包的缺省方法对子类的包外部也不可见。