1、概述

这篇文章比较轻松,直接讲述一下java当中的方法重载和方法重写的区别。主要面向对象还是初学者,因为初学者经常弄混这两个概念性的问题。

2、栗子

一、重载 overloading,这个在JDK里可没有相关注解哦

  1. 方法重载是让类以统一的方式处理不同类型数据的一种手段。重载是一个类中多态性的一种表现。
  2. 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

  1. 父类(接口)与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding),@Override并不是必须的,但建议加上保持良好语意,也能静态检查
  2. 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类
  3. 子类函数的访问修饰权限不能少于父类的;
    有如下父类方法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方法进行静态编译,从而大大提高调用效率的。


【小家java】关于java中方法重载与方法重写的区别_享学Java