方法重载指的是在同一个类中,定义多个方法,这些方法的名字相同但参数列表不同。参数列表可以通过参数的数量、类型或顺序的不同来区分。方法重载是编译时多态性的一种表现。
class MathOperations {
// 两个整数相加
public int add(int a, int b) {
return a + b;
}
// 三个整数相加
public int add(int a, int b, int c) {
return a + b + c;
}
// 两个浮点数相加
public double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
MathOperations math = new MathOperations();
System.out.println(math.add(2, 3)); // 调用第一个 add 方法
System.out.println(math.add(2, 3, 4)); // 调用第二个 add 方法
System.out.println(math.add(2.5, 3.5)); // 调用第三个 add 方法
}
}
在这个例子中,add
方法被重载了三次,每次的参数列表都不同。调用时,编译器根据传递的参数来确定调用哪个 add
方法。
方法重写指的是子类重新定义父类中已经存在的方法。重写的方法必须与父类的方法具有相同的名字、参数列表和返回类型。方法重写是运行时多态性的一种表现。
@Override
注解(推荐但不是必须):@Override
注解用来显式地表示这个方法是重写父类的方法。class Animal {
// 父类中的方法
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
// 子类中重写父类的方法
@Override
public void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
animal.sound(); // 调用父类的方法
Animal dog = new Dog();
dog.sound(); // 调用子类的重写方法
}
}
在这个例子中,Dog
类重写了 Animal
类的 sound
方法。当调用 dog.sound()
时,实际调用的是 Dog
类中的 sound
方法,这是在运行时根据对象的类型决定的。
特性 | 方法重载(Overloading) | 方法重写(Overriding) |
---|---|---|
发生位置 | 同一个类中 | 子类与父类之间 |
方法名 | 相同 | 相同 |
参数列表 | 必须不同(参数类型、数量、顺序不同) | 必须相同 |
返回类型 | 可以相同或不同 | 必须相同或是父类返回类型的子类型 |
访问修饰符 | 可以不同 | 访问修饰符不能低于父类的方法 |
目的 | 提供同一功能的不同版本 | 子类提供特定的实现 |
多态性 | 编译时多态性 | 运行时多态性 |
注解 | 无需 @Override 注解 | 推荐使用 @Override 注解 |
例子 | public int add(int a, int b) 与 public int add(int a, int b, int c) | class Dog extends Animal { @Override public void sound() } |
方法重载:是同一类中多个方法具有相同的名字,但不同的参数列表。它是在编译时决定调用哪个方法,提供了在不同情况下使用同一方法名的灵活性。
方法重写:是子类中重新定义父类中的方法,允许子类根据自身的需要提供特定的实现。它是在运行时决定调用哪个方法,支持多态性。
理解方法重载和方法重写的区别,对于掌握 Java 中的多态性和提高代码的可扩展性至关重要。