首先从概念上
- 重载Overload:表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
- 重写Override:表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。
其次,一般的方法签名的格式如下:
访问权限+返回值类型+方法名+参数列表+抛出的异常
- public void main(String[] args) throws Exception
具体的区别如下:
重载(overload)发生场所:同一个类里(如果是继承,子类中继承父类所有,但不显示)。
重载的两个方法之间的限制:
- 方法名必须相同
- 参数列表必须不同(参数的个数,类型,顺序)
- 访问权限,返回值的类型,抛出的异常(类型,数目)都与重载无关
- 对于继承来说,如果某一方法在父类中是访问权限是private,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
重写(override)发生场所:两个以上类,对接口方法的实现,或者在继承中重写父类的方法。
重写的两个方法之间的限制:
- 方法名必须相同
- 参数列表也必须相同(参数的个数,类型,顺序)
- 返回值的类型必须相同
- 重写的方法所抛出的异常比被重写方法的所抛出的异常更少,或者一致,或者是其子类
- 子类方法的访问权限只能比父类的更大,不能更小。
- 被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
针对上面的比较,为了更清晰一些,列出以下表格
override与overload的区别
区别点 | 重载 overload | 重写 override |
发生场所 | 同一个类里,或者子类中 | 对接口方法的实现,或者在继承中子类重写父类的方法 |
访问权限 | 与重载无关 | 只能比父类的更大,不能更小 |
返回值类型 | 与重载无关 | 必须相同 |
方法名 | 必须相同 | 必须相同 |
参数列表 | 必须不同 | 必须相同 |
抛出的异常 | 与重载无关 | 抛出的异常更少,或者一致,或者是其子类 |
被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。对于继承来说,如果某一方法在父类中是访问权限是private,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。