在java语言中,子类可以继承父类方法,但有时从父类继承的方法在子类中必须进行修改以适应新类的需要,这种对父类方法进行改写或改造的现象称为方法重写或方法覆盖。父类方法在子类中重写使继承更加灵活。
为了举例,我们先创建一个父类并让一个子类继承:
- 什么时候需要重写?
在这段代码中,子类继承了父类的方法,输出“用筷子吃饭”。但很多时候由于实际情况的改变,父类的某些方法不再适用与子类,无法准确描述子类的特征,比如我们假设这里的某个子类对象出国留学,使用刀叉吃饭,则父类方法的“用筷子吃饭“已经不能再适用于这个子类,那么此时我们就需要对这个父类方法在子类中进行重写。
- 如何重写?
重写时,保证方法名和参数名以及参数个数相同是最基本的要求(计算机以此识别这是父类的方法)
package test;
public class Student extends Father{
public void eat() {
System.out.println("用刀叉吃饭");
}//重写父类方法
public static void main(String[] args) {
Student student = new Student();
student.eat();
}
}
执行后结果为
除此之外,还有其他要求:
- 返回值类型:①父类被重写方法没有返回值类型或者返回值类型为基本数据类型,则子类重写方法也不能有返回值或者与父类被重写方法返回值类型相同。
②如果父类被重写的方法返回值类型为引用数据类型,则子类重写方法的返回值类型需要与父类的返回值类型相同或者是其子类。
在这段代码中,父类的返回值类型为Object,子类返回值类型为String,而String为Object的子类,所以程序可以运行,同时String改为其他Object的子类数据类型或者Object本身都是可以的。
- 访问控制符:由于子类重写的方法不能缩写父类被重写方法的访问权限,所以子类重写方法的访问权限必须大于等于父类被重写方法的访问权限 在这段代码中,父类的访问权限为public而子类的为friendly,小于了父类权限,因此报错无法运行。
- 注解:使用@Override注解可以判断当前的方法是否重写了父类的某个方法,在方法上加注解没有报错,则说明重写了父类方法,否则没有。
这里加@Override注解后程序没有报错,且左边的小三角提示方法为重写方法,并指向了父类的被重写方法。
- 注意事项:
①父类中静态方法可以被子类继承,但不能被子类重写
②重写父类非静态方法时,重写的方法不能添加static修饰
结合这两点,其实可以说:静态方法既不能被重写,也不能用于重写。
③父类中被final关键字修饰的方法可以被子类继承,但不能被子类重写。