重载(Overload):
(1)重载是指在同一个类中定义多个具有相同名称的方法,但这些方法具有不同的参数列表。
(2)重载方法的特征是方法名称相同,但参数列表不同,包括参数的类型、数量或顺序。
(3)重载方法可以有不同的返回值类型。
(4)编译器根据调用时使用的参数列表来确定调用哪个重载方法。
(5)重载用于提供多个方法,执行类似但参数不同的操作,以增强代码的可读性和可维护性。
示例:
class MathUtils {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
重写(Override):
(1)重写是指在子类中定义一个与父类中的方法具有相同名称、参数列表和返回类型的方法,以提供自己的实现。
(2)重写通常用于子类需要改变继承自父类的方法行为的情况。
(3)重写要求子类方法必须与父类方法相同,以便运行时多态性(polymorphism)正确工作。
(4)在运行时,程序会根据对象的实际类型来决定调用哪个方法。
(5)重写要求子类的访问修饰符权限不能为private,子类访问修饰符可以和父类一样,但不能比父类访问权限更低。
示例:
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
(6)返回值类型可以有一些灵活性,具体取决于编程语言的支持。在某些编程语言中,子类可以返回与父类方法不同的子类型,这被称为"协变返回类型"。这通常适用于一些面向对象语言,如Java,C#和C++,并且是因为子类的返回类型是父类返回类型的子类型。
示例:
class Animal {
Animal reproduce() {
// ...
return new Animal();
}
}
class Dog extends Animal {
@Override
Dog reproduce() { // 协变返回类型
// ...
return new Dog();
}
}
总结:(1)重载和重写都涉及使用相同的方法名,但它们有不同的目的和规则。
(2)重载是在同一个类中定义多个方法,具有不同的参数列表,用于提供不同的方法重载,而重写是在子类中覆盖父类的方法,以提供自己的实现。
(3)重载是在编译时确定哪个方法被调用,而重写是在运行时通过多态性来决定调用哪个方法。