高频考点之方法重载与重写的区别

1.重载(overload)

定义:在一个类中,同名方法如果形参列表不同(参数类型不同、参数个数不同、参数顺序不同)就是重载。注意:重载不关心方法的返回值类型

举个例子:以下静态方法都构成重载
高频考点之方法重载与重写的区别

2.重写(override)

定义:子类继承了父类原有的方法,但是实际开发中我们并不是原封不动得继承父类的方法,需要在子类中对父类继承来的方法进行改造。子类方法对父类方法的覆盖、覆写就叫做重写

要求

  • 子类重写的方法必须和父类被重写的方法具有相同的方法名、参数列表
  • 子类重写方法的返回值类型不能大于父类被重写方法的返回值
    规则:如果被重写方法的返回值为void,重写方法的返回值只能为void
    如果被重写方法的返回值是基本数据类型,则重写方法必须是相同的基本数据类型
    如果被重写方法的返回值是A类,则重写方法返回值必须是A类或者A类的子类
  • 子类重写方法的访问权限不能小于父类被重写方法的访问权限
    规则:public > protected > 缺省 > private
    注:子类不能重写父类中声明为private权限的方法,方法被定义为final不能被重写
  • 子类方法抛出的异常不能大于父类被重写方法的异常 里氏代换原则

注意
子类与父类同名同参数列表的方法必须同时声明为非static的(重写),或者同时声明为static(非重写)

例:以下构成了重写
父类被重写方法eat:
高频考点之方法重载与重写的区别
子类重写方法eat:
高频考点之方法重载与重写的区别

重载与重写的区别

  • 重载和重写实现的都是多态性,前者实现的是编译时的多态性,后者实现的是运行时的多态性
  • 重载发生在一个类中,并且方法名相同,参数列表不同。而重写发生在子类和父类之间,要求方法名相同,参数列表和返回值类型也要相同,方法体不同(如果方法体相同,那么重写没啥意义了)
  • 重载与访问修饰符、返回值类型,抛出异常无关,而重写必须满足方法被定义为final不能被重写、重写方法的返回值类型不能大于被重写方法的返回值类型、子类抛出的异常不能大于父类

如有错误,还请指正。