在 Java 中,重载(Overloading)和重写(Overriding)是两种不同的概念,虽然它们有相似的名称,但它们有不同的作用和实现方式。以下是它们的主要区别:
1. 定义
-
重载(Overloading):是指在同一个类中,方法名相同,但参数列表(参数的数量、类型或顺序)不同的情况。重载的方法可以有不同的返回类型,但返回类型不是区分重载方法的依据。
-
重写(Overriding):是指子类重新定义继承自父类的方法,使得子类的方法可以替换掉父类的实现。重写的方法必须具有与父类方法相同的方法签名(方法名、参数列表)。
2. 方法签名
-
重载:方法名相同,但参数列表必须不同。参数的数量、类型或顺序发生变化,才算是重载。
-
重写:方法名、参数列表、返回类型必须与父类中被重写的方法完全相同。
3. 作用
-
重载:增加了类中可用的不同版本的方法,使得一个方法可以根据不同的参数被调用。
-
重写:允许子类提供对父类方法的特定实现,目的是为了改变或扩展父类的行为。
4. 返回类型
-
重载:返回类型可以不同,但是返回类型不是区分重载的方法的标准。
-
重写:返回类型必须与父类方法的返回类型相同,或者是父类返回类型的子类类型(协变返回类型)。
5. 发生时机
-
重载:发生在编译时(静态绑定),Java 编译器根据方法调用时提供的参数类型和数量来决定调用哪个重载的方法。
-
重写:发生在运行时(动态绑定),Java 虚拟机(JVM)根据对象的实际类型来决定调用哪个方法。
6. 示例
重载示例:
class Example {
// 方法1:接受一个整数
public void display(int a) {
System.out.println("Integer: " + a);
}
// 方法2:接受一个字符串
public void display(String a) {
System.out.println("String: " + a);
}
// 方法3:接受一个整数和一个字符串
public void display(int a, String b) {
System.out.println("Integer: " + a + ", String: " + b);
}
}
重写示例:
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");
}
}
总结:
- 重载是同一个类中,方法名相同但参数不同的方法,目的是提供多个版本的同一方法。
- 重写是子类对父类方法的实现,目的是改变或扩展父类的行为。