方法重载
定义
Java中,在同一个类中有多个参数列表不同的重名方法,这成为方法重载
参数列表包括:参数个数、参数类型、参数顺序,只要有一个不同中则称为参数列表不同
重载是面向对象的一个基本特性。
作用
减少代码量,让程序更简洁
举个例子
如果不用方法重载,我们想进行不同类型数据加法,我们需要创建int类型加法函数、double类型加法函数.....
public class demo{
public static main(String []args){
System.out(sumInt(1,2));
System.out(sumLong(2L,2L));
System.out(sumDouble(1,2));
}
int sumInt(int a,int b){
return a+b;
}
long sumLong(long a,long b){
return a+b;
}
double sumDouble(double a,double b){
return a+b;
}
}
这样记好多个函数的名字就很麻烦
如果用了函数重载之后,可以让三种加法方法函数名相同,只需要记一个就行,调用时候,会根据传入方法的参数类型选择正确的方法
如
public class demo{
public static main(String []args){
System.out(sum(1,2));
System.out(sum(2L,2L));
System.out(sum(1,2));
}
int sum(int a,int b){
return a+b;
}
long sum(long a,long b){
return a+b;
}
double sum(double a,double b){
return a+b;
}
}
注意事项:
- 参数列表不同包括:个数不同、顺序不同、类型不同。
- 仅仅参数变量名称不同是不可以的。
- 跟成员方法一样,构造方法也可以重载。
- 声明为static的方法不能被重载,但是能够被在此声明。
方法的重载的规则:
- 方法名称必须相同。
- 参数列表必须不同。
- 方法的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以称为方法的重载。
方法重载的实现:
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错,这叫做重载分辨。
方法重写
解决的问题
当父类中的某个方法并不能满足子类的需求时,可以在子类中对该方法进行重新定义以满足子类的需求
规则
- 与方法重载不同的是方法重写要求子类中要重写的方法必须与父类中对应的方法一模一样(这里的一模一样包括返回值类型,方法名,参数列表)
- 子类中重写的方法的访问权限不能低于父类中方法的访问权限
- 重写的方法可以使用@Override注解来标识
- 两个类必须有继承关系
- 重写后的方法不能比重写前的方法抛出更多的异常
为什么说子类中重写的方法的访问权限不能低于父类中方法的访问权限?
举个例子,Object中有一个hashCode()方法,这个方法是所有类都必须有的一个方法,可以实现不同,但必须有,这个方法在Object中定义的是public,如果某个类中,重写该方法,改成了private,那么其子就继承不了这个方法,但这个方法是每个类必须有的,private权限的方法和变量是无法继承的。
为什么说重写后的方法不能比重写前的方法抛出更多的异常?
举个例子,父类中的一个方法跑出IoException 子类重写了这个方法,但是抛出了Exception,那么问题来了,当我们使用父类这个方法时需要进行异常处理,那么此时如果捕捉IoException的话,可能会发生错误,因为如果这个父类引用指向的是子类的对象的话,子类该方法抛出的是Exception,该异常将无法被捕捉!
注意事项
- 方法重写只是针对于方法,与属性无关
- 私有方法无法覆盖
- 构造方法不能被继承,所以构造方法也不能被覆盖
- 方法覆盖只是针对于实例方法,静态方法覆盖没有意义