方法重载与方法重写的区别与细节
方法重载
在一个类中,存在两个或者两个以上的同名函数,就称作方法重载
方法重载的细节如下:
- 函数名要一致
- 形参列表不能一致(形参个数不能一致或者形参类型不能完全一致)
- 与返回值无关
- 与权限修饰符无关
public void show(){
System.out.println("this is son");
}
private int show(String k){
return 100;
}
如上面的代码:一个是public 一个是private,但仍然是方法重载,一个返回void一个返回int,也不影响它是重载,因为它们的形参列表一个为空,一个是String类型并且它俩的方法名一致.这就可以了.
方法重写
子类与父类出现了同名的函数
- 方法重写时,两个方法的名称与形参列表必须保持一致
- 方法重写时,子类方法的权限修饰符必须要大于或者等于父类方法的权限修饰符
- 方法重写时,子类方法的返回值必须要小于或者等于父类方法的返回值类型
- 方法重写时,子类方法抛出的异常类型要小于或者等于父类方法抛出的异常类型
如何记住并理解重写的这些概念呢?
首先我们设想一个场景,使用父类引用去调用子类方法.
Parent p = new Son();
p.show(String content);
如果两个方法名与形参列表不一致,那么父类就无法调用子类真正的实现方法.所以第一条成立.
如果子类的show方法是private而父类方法是public的,那么就无法通过父类的show方法调用到子类的show方法,因为对于父类引用来说,子类的show方法是隐藏的.所以第二条也成立
如果子类的返回值类型大于父类的返回值类型,那么通过父类调用子类方法的时候,就无法使用父类的返回类型来接收子类方法的结果了,所以第三条也成立
如果子类抛出的异常类型大于父类方法抛出的异常类型,同样的,用于捕获异常的代码就无法捕获子类抛出的异常,因为在使用父类调用子类方法时,它只能捕获父类方法抛出异常的类型及其子类型.所以第四条也成立