Java的面向对象
07-方法的重写
2021-07-01 831 0
简介 理解方法的重写(override/overwrite)
方法的重写(override/overwrite)
首先来看下重写的定义:在子类中可以根据需要对从父类中继承来的方法进行改造, 也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
要求和注意:
1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称、 参数列表
2. 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型(一般都声明为相同的返回值类型)
3. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限(一般都声明为相同的访问权限)
4. 子类不能重写父类中声明为private权限的方法(父类中的private方法子类不可见,也就无所谓覆盖了)
5. 子类方法抛出的异常不能大于父类被重写方法的异常
6. 子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写) 。因为static方法是属于类的,子类无法覆盖父类的static方法。
1.重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作
2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
3. 重写的规定:
方法的声明: 权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型{
//方法体
}
约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法
① 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同(如何区分方法是唯一的? 方法名+形参列表)
② 子类重写的方法的权限修饰符 大于等于 父类被重写的方法的权限修饰符(理解: 更大的权限才能覆盖小的)
>特殊情况:子类不能重写父类中声明为private权限的方法
③ 返回值类型:
>父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
>父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
>父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须也是double)
④ 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(具体放到异常处理时候讲)
**********************************************************************
子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。
父类中的 static 方法是不能重写的, static的方法不能覆盖,是随着类的加载而加载的
面试题:区分方法的重载与重写
代码的继承树
//Person.java package com.ylaihui.oop3; public class Person { public void eat(){ System.out.println("Person eat..."); } void walk(){ System.out.println("Person walk..."); } private void show(){ System.out.println("Person show..."); } void fun(){ // 如果 Student 类能将show重写,那么会调用 Student 中的 show show(); // Student 将 父类的 eat 方法重写 eat(); } public Object info(){ System.out.println("info fun..."); return null; } public short fun1() { return (short)1; } }
//Student.java package com.ylaihui.oop3; public class Student extends Person{ // 重写父类 public void eat(){ System.out.println("Student eat..."); } // 可以重写父类默认权限修饰的walk方法, 本方法为public public void walk(){ System.out.println("Student walk..."); } public void show(){ System.out.println("Student show..."); } // 子类方法的返回值类型 可以是 被重写的父类方法的 返回值类型的子类 String 是 Object的子类 public String info(){ System.out.println("info fun..."); return null; } // ERROR - The return type is incompatible with Person.fun1() // public int fun1() { // return (short)1; // } }
//StudentTest.java package com.ylaihui.oop3; public class StudentTest { public static void main(String[] args) { Student s = new Student(); // 重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。 s.eat(); s.walk(); s.show(); System.out.println("----"); s.fun(); System.out.println("----"); Person p = new Person(); p.eat(); } }
代码输出
Student eat...
Student walk...
Student show...
----
Person show...
Student eat...
----
Person eat...