java中重载和重写的区别详解

java中重载和重写的区别详解
最新回答
别说你也难过

2023-04-08 21:43:11

在Java中,重载(Overload)和重写(Override)是两种不同的方法定义方式,主要区别体现在定义位置、参数列表、返回值类型、访问权限及实现目的上。具体如下:

  • 定义位置与类关系

    重载发生在同一个类中,允许存在多个同名方法。

    重写发生在不同的类中,且要求子类与父类存在继承关系。

上图展示了同一类中三个add方法的重载,参数列表不同(个数或类型差异)。
  • 参数列表要求

    重载要求方法的参数列表必须不同(参数个数、类型或顺序不同),与返回值类型无关。例如,同一类中可定义int add(int a, int b)和float add(float a, float b)。

    重写要求方法的参数列表必须完全一致,包括参数类型、顺序和个数。

  • 返回值类型规则

    重载对返回值类型无强制要求,可相同也可不同。

    重写的返回值类型必须与父类方法一致,或为父类方法返回类型的子类(协变返回类型)。

  • 访问权限限制

    重载方法的访问权限(如public、protected、private)可自由调整,无强制约束。

    重写方法的访问权限不能比父类方法更严格。例如,父类方法为protected,子类重写时不能改为private。

  • 异常抛出规则

    重载方法可抛出任意异常,无限制。

    重写方法抛出的异常不能比父类方法更宽泛。例如,父类方法抛出IOException,子类重写时可抛出FileNotFoundException(子类异常),但不能抛出Exception(父类异常的父类)。

  • 实现目的

    重载的目的是提供同一功能的多种实现方式,通过参数差异适应不同场景。例如,System.out.println()可输出多种数据类型。

    重写的目的是修改或扩展父类方法的行为,使子类能根据自身需求定制功能。例如,父类定义动物叫声方法,子类(如狗、猫)重写该方法以实现特定叫声。

上图展示了子类Test4重写父类Test3的num方法,将加法运算改为减法运算。
  • 绑定方式

    重载是编译时多态,编译器根据调用方法的参数列表决定具体执行哪个方法。

    重写是运行时多态,程序运行时根据对象实际类型决定调用哪个方法(动态绑定)。

总结:重载强调“同一类中方法多样性”,通过参数差异实现;重写强调“子类对父类方法的定制”,需严格遵循参数一致、访问权限放宽等规则。两者共同构成了Java方法灵活性的基础。