重载(overloading)和重写(overriding)是两个与方法相关的概念。它们的区别如下:
重载(overloading)同的是指在同一个类中定义多个方法,它们具有相名称但具有不同的参数列表。重载的目的是为了方便使用者根据不同的参数类型或参数个数来调用合适的方法。在重载中,编译器会根据调用时传入的参数来选择合适的方法进行调用。重载方法的返回类型可以相同也可以不同。
重写(overriding)是指在子类中重新定义父类中已经定义的方法。重写要求子类方法的名称、参数列表和返回类型与父类方法的名称、参数列表和返回类型完全相同。重写的目的是为了改变父类方法的实现方式,使之适应子类的特定需求。在重写中,编译器在运行时会根据对象的实际类型来选择调用哪个方法。重写方法的返回类型必须与父类方法的返回类型相同或是其子类型。
详细:
- 定义和范围:
- 重载:在同一个类中,当方法名相同但参数列表(参数个数、类型或顺序)不同时,构成方法重载。重载与返回值类型、方法参数名以及访问修饰符无关。
- 重写:子类可以继承父类,并对父类中已存在的同名同参数的方法进行覆盖操作。重写发生在子类与父类之间。
- 多态性:
- 重载:主要体现的是编译时的多态性。编译器在编译时会根据传入的参数类型等信息,确定调用哪个重载的方法。
- 重写:主要体现的是运行时的多态性。当创建子类对象后,通过子类对象调用子类和父类中同名同参数的方法时,实际执行的是子类重写后的方法。
- 访问修饰符:
- 重载:对访问修饰符没有特殊要求。因为重载是根据方法名和参数列表来区分的,与访问修饰符无关。
- 重写:子类重写父类方法时,访问修饰符的限制一定要大于或等于被重写方法的访问修饰符。例如,如果父类中的方法是public的,那么子类中的重写方法也必须是public的或者具有更宽松的访问修饰符(但这种情况在Java中并不存在,因为public已经是最宽松的访问修饰符了)。
- 返回类型:
- 重载:对返回类型没有要求。因为重载是根据方法名和参数列表来区分的,与返回类型无关。
- 重写:要求返回类型必须与被重写方法的返回类型相同或者是其子类。
- 参数列表:
- 重载:参数个数、参数类型或参数顺序可以不同。
- 重写:父子方法参数必须相同。
总的来说,重载是在同一个类中定义多个具有相同名称但具有不同参数列表的方法,用于方便调用不同参数的方法;而重写是在子类中重新定义父类中已经定义的方法,用于改变父类方法的实现方式。重载是在编译时静态决定的,而重写是在运行时动态决定的。