什么是重载?
重载是发生在
一个类
里,方法名相同,参数类型不同,而且与返回值无关的
重载的要求
重载允许不同的方法有相同的方法名,但是他们的签名不同,其中签名可以根据输入参数的数量或输入参数的类型或两者而不同。
重载规则
- 被重载的方法必须参数个数或类型不一样;
- 被重载的方法可以改变返回类型,也可以改变访问修饰符,但是只改变这个两个不是方法的重载
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准
例子:
1 | public class Demo { |
什么是重写?
重写是子类对父类允许访问的方法重新编写方法体,注意是名称、参数列表都相同的方法,而且返回值也不能改变。
重写规则
- 参数列表应与重写方法的列表完全相同。
- 返回类型应该与超类中原始重写方法中声明的返回类型相同或是子类型。
- 访问级别不能比重写方法的访问级别更具限制性。例如:如果超类方法被声明为public,则子类中的重写方法不能是private或protected。
- 当实例方法由子类继承时,才能重写它们。
- 声明为final的方法无法重写。
- 声明为static的方法不能被重写,但可以重新声明。
- 如果某个方法无法继承,则无法重写该方法。
- 与实例的超类在同一个包中的子类可以重写任何未声明为private或final的超类方法。
- 不同包中的子类只能重写声明为public或protected的非final方法。
- 无论被重写的方法是否抛出异常,重写方法都可以抛出任何unchecked异常。但是,重写方法不能抛出比被重写方法声明的异常更广泛的异常。覆盖方法可以抛出比重写方法更窄或更少的异常。
- 构造函数不能被重写。
例子
1 | public class Override { |
重载与重写的区别
- 重载可修改参数类型也可修改参数个数,但是重写是
一定不能
修改参数类型和个数的- 重载可以修改返回值类型,但是只修改返回值类型是不算重载的,重写不能修改返回值类型
- 重载可以修改异常,重写修改异常要注意
可以减少或删除,一定不能抛出新的或者更广的异常
- 重载可以修改修饰符,重写是不能用限制更高的修饰符