- 在子类中可以根据需要对父类中继承来的方法进行改造,也成为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
- 要求:
- 方法名和形参列表必须一样
示例:
// 父类的eat方法 public void eat() { System.out.println("吃饭"); } // 子类中改写该方法 public void eat() { System.out.println("学生应该多吃有营养的事务"); }
此时调用子类中的eat方法,执行的是子类改写后的方法
问题:如何区分方法的重载与重写
- 重载:是指允许存在多个同名方法,而这些方法的参数不同,编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定了。Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。
- 所以,对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或者“静态绑定”。
- 而对于多态,只有等到方法调用的那一刻,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”
- 即:如果它不是晚绑定,它就不是多态
重写的规定:
- 方法的声明:权限修饰符 返回值类型 方法名(形参列表){方法体}
- 约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法
- 子类重写的方法名和形参列表和父类中重写的方法名和形参列表相同
- 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
- 特殊情况:子类不能重写父类中声明为private权限的方法
- 返回值类型:
- 父类被重写的方法的返回值类型是void,则子类重写的方法的返回值只能是void
- 父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或者A类的子类
- 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是相同的基本数据类型
- 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
- 子类和父类中同名同参数的方法要么都声明为非static的,要么都声明为static的。