Java中的重载(overloading)和重写(overriding)都涉及到方法的多态性,但它们在实现方式和目的上有所不同。
重载是指在同一个类中定义多个具有相同名称但参数类型或数量不同的方法。这些方法可以拥有不同的返回值类型,但不能仅仅通过返回类型来区分方法重载。当调用方法时,编译器会根据传入的参数类型、数量和顺序来确定调用哪个方法。因此,重载方法的特点是方法名相同,但参数列表不同。
例如,下面的代码演示了一个添加两个数的方法add,其中有三个版本的重载方法,每个版本接受不同的参数类型:
public class Calculator {
public int add(int x, int y) {
return x + y;
}
public double add(double x, double y) {
return x + y;
}
public String add(String x, String y) {
return x + " " + y;
}
}
重写是指子类重新定义其父类中已有的方法,以便更改或扩展其行为。重写方法必须与父类方法具有相同的方法名,参数列表和返回类型,但可以有不同的实现。重写方法通常用于实现多态性,当调用该方法时,实际上执行的是子类中的方法,而不是父类中的方法。
例如,下面的代码演示了一个Animal类以及两个子类Dog和Cat,其中Dog和Cat都重写了父类的speak()方法:
public class Animal {
public void speak() {
System.out.println("I am an animal");
}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println("Woof!");
}
}
public class Cat extends Animal {
@Override
public void speak() {
System.out.println("Meow!");
}
}
当创建一个Dog或Cat对象并调用speak()方法时,实际上执行的是子类中的方法,而不是父类中的方法。
总的来说,重载和重写都涉及到方法的多态性,但它们的实现方式和目的有所不同。重载方法通过方法名和参数列表来确定具体调用哪个方法,而重写方法则是在子类中重新定义其父类中已有的方法以实现多态性。