尚硅谷JavaSE基础
6.6.2方法覆盖(override)
1. 什么是方法覆盖
定义:
在子类中可以根据需要对从父类中继承来的方法进行改造,
也称方法的重写、重置。在程序执行时,子类的方法将覆盖父类的方法。
要求:
覆盖方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型。
覆盖方法不能使用比被重写方法更严格的访问权限。
覆盖和被覆盖的方法必须同时为非static的。
子类方法抛出的异常不能大于父类被重写方法的异常
public class Person { public String name; public int age; public String getInfo() { return "Name: "+ name + "\n" +"age: "+ age; } } public class Student extends Person { public String school; int age; public String getInfo() { //重写方法 return "Name: "+ name + "\nage: "+ age + "\nschool: "+ school; } public static void main(String args[]){ Student s1=new Student(); s1.name="Bob"; s1.age=20; s1.school="school2"; System.out.println(s1.getInfo()); //Name:Bob age:20 school:school2 执行的是子类重写过的方法 } } |
2.为什么要方法覆盖
有的时候子类继承的父类方法并不能满足子类的需要, 而方法名称又要保持一致, 此时用到方法覆盖.
3. 方法覆盖的特殊性
子类一旦把父类的方法覆盖, 那么在测试类中再无法通过子类对象调用父类的被覆盖方法了, 因为子类已经把父类的方法重写了, 如果有调用父类方法的需求, 只能通过再创建一个父类对象来调用.
4. @Override注解的使用
有的时候, 在子类中写重写方法时, 容易出现一些低级的拼写错误, 或其他错误, 导致方法不能正确覆盖时, 程序的运行就会出乎意外, 所以为了防止这种现象, 在子类的覆盖方法上添加修饰符@Override注解.
注解 : 本质上一种类, 也是一种特殊的注释, 所以一般情况下, 程序不执行注解, 但是会被编译器, 运行时所识别和处理(通过反射的方式).注解也有很多.
@Override注解的作用是告诉编译器, 在编译程序时, 必须先检查此方法是否满足方法覆盖的条件, 如果不满足, 则编译出错, 这样强制程序员通过排查, 提前检查方法覆盖的问题.
public class Student extends Person { public String school; int age; @Override // 加上注解, 也能提高代码可读性 public String getInfo() { //重写方法 return "Name: "+ name + "\nage: "+ age + "\nschool: "+ school; } } |