Overload中文是重载的意思,Override中文是重写的意思。
Overload重载表示一个类中可以有多个同名方法,但参数列表各不相同(参数个数、类型、位置不同)。如果类中有多个同名的方法,但是参数列表各不相同,那么它们的返回列表可以相同也可以不相同;如果同名的方法参数列表相同,想通过返回类型不同来区分,这是不能实现重载的。譬如 list.remove(obj) 这个方法我不接收返回值,那么怎么能通过返回值的不同去实现重载呢。重载的几条规则:
- 不能通过访问权限、返回类型、抛出的异常进行重载;
- 而使用重载只能通过不同的参数个数、类型、位置来实现;
- 同名方法的异常类型与数量不影响重载;
- 如果是继承父类的方法,但父类方法是private,那么这个方法只能是被父类访问,子类就不能重载这个父类方法了。如果要定义的话,也只是定义了一个新的方法,而不会达到重载效果;
- 重载方法多数在web前台查询条件比较多的时候用到;
重载(覆盖)是java实现多态的重要技术,也为编程带来了便利,参数不同的构造方法也属于重载范畴。
Override重写表示子类方法中有可以跟父类方法名相同且参数列表也相同的方法,通过子类创建的对象去调用这个方法时,将用调用子类定义的方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。重写的要求:
- 子类只能比父类抛出更少的异常,或者是父类抛出异常的子异常。子类只能解决父类管辖之内的异常,不能抛出超出父类管辖之外的异常;
- 子类的访问权限只能是比父类更大,不能更小。如果父类的方法访问权限是private,那么子类就不能重写,只能算是重新定义了一个方法;
- 子类方法返回值必须跟父类返回值保持一致;
- 子类方法必须跟父类方法的标志完全一致;
获取的原则是:
若每一个参数都可以完全匹配,它就是最佳可行方法;
若某个方法的每一个参数都不比别的方法差,且至少有一个参数比别的方法好,它就是最佳可行方法,这里的差和好是指,完全匹配要比扩展转化好,不过同样是扩展转换,仍然存在好喝差的问题,扩展转换有两条路径;
例如:
byte-short-int-long-float-double
char-int-long-float-double
这两条路径中位于左边的类型都可以转换为右边的类型,不过源类型与目标类型的距离越近,则这种转化就越好。
示例:
- show(int a ,int b,int c) //1
show(int a ,int b,double c) //2
show(int a ,double b,double c)//3
show(double a,double b,int c) //4
下面是调用
show(1,2,3);//1,2,3,4都是可行方法所有参数完全匹配1
show(1.0,2.0,3.0);//没有一个可行方法
show(1.0,2,3);//4是最佳可行方法
show(1,2.0,3);//3,4都是可行方法,没有最佳可行方法,报错
重载与重写的区别:
- 重载和覆盖的方法名称都相同,但重载要求参数列表不同,而覆盖要求参数列表完全相同;
- 重载对于方法前面的修饰符没有限制,而覆盖则对这些修饰符的使用有限制;
- 重载时编译器在编译期间就可以确定调用那一个方法,而覆盖则有可能在运行期间才能确定;
重载与重写都是java实现多态的重要技术之一。