重写(覆盖)
子类中出现与父类一模一样的方法时(返回值类型,方法名 和 参数列表 都相同),会出现 覆盖 效果,也称为 重写,Override
代码如下:
package demo10;
public class Person {
String name;
int age;
public Person(){
System.out.println("Person默认构造方法");
}
void eat(){
System.out.println("吃");
}
void play(){
System.out.println("玩");
}
}
package demo10;
public class Student extends Person {
String clazz;
public Student() {
System.out.println("Student默认构造方法");
}
void eat(){
System.out.println("吃香的");
}
}
作用
子类可以根据需要,沿用了父类的 方法名称,又重新 实现父类方法,从而进行扩展增强。
智能手机 继承了 功能机 的 打电话,但是 技术更新了,用的是 4G信息 打电话(早期用的2G信号)。
同样是 打电话,但技术实现更新了
重写规则
- 参数列表必须完全与被重写的方法参数列表相同。
- 返回的类型必须与被重写的方法的返回类型相同
(Java1.5 版本之前返回值类型必须一样,之后的 Java 版本放宽了限制,返回值类型必须小于或者等于父类方法的返回值类型)。 - 访问权限不能比父类中被重写方法的访问权限更低(public>protected>default>private)。
- 重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的检査型异常。
例如,父类的一个方法声明了一个检査异常 IOException,在重写这个方法时就不能抛出 Exception,只能拋出 IOException 的子类异常,可以抛出非检査异常。
注意以下几条
- 重写的方法可以使用
@Override注解来标识。 - 父类的成员方法只能被它的子类重写。
- 声明为
final的方法不能被重写。 - 声明为
static的方法不能被重写,但是能够再次声明。 - 构造方法不能被重写。
- 子类和父类在同一个包中时,子类可以重写父类的所有方法,除了声明为 private 和 final 的方法。
- 子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法。
- 如果不能继承一个方法,则不能重写这个方法。