1、概述
这篇文章比较轻松,直接讲述一下java当中的方法重载和方法重写的区别。主要面向对象还是初学者,因为初学者经常弄混这两个概念性的问题。
2、栗子
一、重载 overloading,这个在JDK里可没有相关注解哦
- 方法重载是让类以统一的方式处理不同类型数据的一种手段。重载是一个类中多态性的一种表现。
- Java的方法重载,就是可以在类里定义多个同名的方法,但具有不同的参数和不同的定义(不同的参数列表)。调用方法时才决定最终调用哪个方法,这也是多态性的表现。这里推荐大家可以了解一下java当中的重载决策,可以参考我另外一篇博文中有说到过:List 的删除操作,你知道多少?
里面对remove重载解释的时候有介绍到,各位有空可以看看。
比如spring框架中BeanFactory.getBean()方法,就有大量的重载实现:
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
重载用得好,也可大大提高你的代码设计的向下兼容能力。
重载的返回值类型可以相同也可以不同
二、重写overriding。强烈建议如果是重写,请加上方法注解:@Override
- 父类(接口)与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding),@Override并不是必须的,但建议加上保持良好语意,也能静态检查。
- 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
- 子类函数的访问修饰权限不能少于父类的;
有如下父类方法GenericService.test:
protected Object test(Object id) {
return null;
}
我们复写可以这么来:
@Override
protected Object test(Object id) {
return null;
}
//使用public修饰
@Override
public Object test(Object id) {
return null;
}
//使用final修饰也可以
@Override
public final Object test(Object id) {
return null;
}
//返回值用子类也行,这里用了user对象(用父类就不行了哟)
@Override
public final User test(Object id) {
return null;
}
//但不能用private修饰了,因为private小于protected **下面这个就是错的**
@Override
private User test(Object id) {
return null;
}
备注:入参必须一模一样,类型也是。但返回值允许返回是父类的子类,访问权限可以比父类高。复写的方法还可额外 static 、final、 native 、 synchronized等修饰
另外,接口中如果存在继承,子接口也是可以@Override父接口的哟,这个在平常使用经常遇到,这样具体子接口就能有更好的语意了。
3、使用场景
处处都有
4、最后
若方法类型为priavte static final ,java采用静态编译,编译器会准确知道该调用哪个方法。因此本人建议,能private的方法尽量不要public,因为JVM能够对private方法进行静态编译,从而大大提高调用效率的。