2023-04-08 21:43:11
在Java中,重载(Overload)和重写(Override)是两种不同的方法定义方式,主要区别体现在定义位置、参数列表、返回值类型、访问权限及实现目的上。具体如下:
重载发生在同一个类中,允许存在多个同名方法。
重写发生在不同的类中,且要求子类与父类存在继承关系。

参数列表要求
重载要求方法的参数列表必须不同(参数个数、类型或顺序不同),与返回值类型无关。例如,同一类中可定义int add(int a, int b)和float add(float a, float b)。
重写要求方法的参数列表必须完全一致,包括参数类型、顺序和个数。
返回值类型规则
重载对返回值类型无强制要求,可相同也可不同。
重写的返回值类型必须与父类方法一致,或为父类方法返回类型的子类(协变返回类型)。
访问权限限制
重载方法的访问权限(如public、protected、private)可自由调整,无强制约束。
重写方法的访问权限不能比父类方法更严格。例如,父类方法为protected,子类重写时不能改为private。
异常抛出规则
重载方法可抛出任意异常,无限制。
重写方法抛出的异常不能比父类方法更宽泛。例如,父类方法抛出IOException,子类重写时可抛出FileNotFoundException(子类异常),但不能抛出Exception(父类异常的父类)。
实现目的
重载的目的是提供同一功能的多种实现方式,通过参数差异适应不同场景。例如,System.out.println()可输出多种数据类型。
重写的目的是修改或扩展父类方法的行为,使子类能根据自身需求定制功能。例如,父类定义动物叫声方法,子类(如狗、猫)重写该方法以实现特定叫声。

重载是编译时多态,编译器根据调用方法的参数列表决定具体执行哪个方法。
重写是运行时多态,程序运行时根据对象实际类型决定调用哪个方法(动态绑定)。
总结:重载强调“同一类中方法多样性”,通过参数差异实现;重写强调“子类对父类方法的定制”,需严格遵循参数一致、访问权限放宽等规则。两者共同构成了Java方法灵活性的基础。