重载(overloading)和重写(overriding)的区别
重载(overloading)
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
- 事实上,重载也可以针对同一函数针对不同传入类型进行设计,如在实验三中可以针对为IntervalSet和MultiIntervalSet进行重载,以展示出不同的行为。
- 在一个类中,同名的方法有不同的参数列表,这是重载表现出的效果
- 重载的参数列表一定要是不同的。这里的参数列表可以看做不同的对象。发生重载一定是在一个类中,重载是针对不同的对象有不同的操作。
- 重载是实现多态的一种方式(编译阶段)
- 重载对返回类型没有要求,但不能有两个同名同参数列表、返回类型不同的函数。
重写(overriding)
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
在面向对象原则里,重写意味着可以重写任何现有方法。
- 重写是发生在两个类之间,即子类对父类中的方法进行重新定义。但子类不可以改变父类方法的方法名,参数列表,返回类型(除非子类的返回值是它父类的返回值的子类)。
- 重写也是实现多态的一种方式(运行阶段)
- 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常
- 在重写方法中,对访问修饰符的限制,子类一定要大于父类(public>protected>default>private)