重载
定义
重载:在一个类中,存在多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载。
编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析。
注:重载和修饰词、返回值无关,只与参数的个数、类型、顺序有关。
与参数的个数、类型大家都清楚,与顺序有关的例子如下,大家忘了的可以试下
public class Test{
public void sum(int i,String j){
}
public void sum(String j,int i){
}
}
说明:在Test类中有两个同名的方法。在调用方法时,如果传入的第一个参数类型为int,第二个参数类型为String,则自动调用第一个方法sum。如果传入的第一个参数为String类型,第二个参数类型为int,则自动调用第二个方法sum。
特点
1、必须是两个以上同名的方法
2、方法之间的参数组合必须不同(参数的数目不同或者参数的类型不同)
3、方法的返回值不能作为判断方法之间是否构成重载的依据
作用
方法重载就是对不同数据类型的的数据实现相似的操作。
比如我们输出语句就是典型的例子,重载的方法特别多。
重写
定义
在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
注:如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
重写的规则
重写不能破坏父类的访问性和逻辑结构性。
- 重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别。(即子类中的权限不能小于父类的权限)
例子:
public class A {
protected void hello() {
}
}
class B extends A{
private void hello() {
}
}
报错,父类方法是包访问权限,子类的重写方法是private访问权限,权限太小了
public class A {
public void hello() {
}
}
class B extends A{
void hello() {
}
}
报错,出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。
- 重写规则之二: 参数列表必须与被重写方法的相同。
- 重写规则之三:返回类型必须与被重写方法的返回类型相同。
- 重写规则之四:重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
- 注意:这种限制只是针对检查异常,至于运行时异常RuntimeException及其子类不再这个限制之中。
- 重写规则之五: 不能重写被标识为final的方法。
- 重写规则之六:如果一个方法不能被继承,则不能重写它。如private方法
作用
重写是为了增强类的重用性和复用性,扩展性;重写是对类中方法的扩充,因为继承用的是父类的东西,重写则不仅得到父类的东西,同时也加入了自己的东西。
重载重写区别
- 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
- 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
- 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常。
- 重载对返回类型没有特殊的要求。