【JAVA】关于重写(Override)与重载(Overload)
重载(Overload)和覆盖(Override)是面向对象编程中的两个概念,但它们有着本质的不同:
- 重载(Overload): 是指在同一个类中,允许存在多个同名方法,这些方法的参数类型、参数个数或者参数顺序不同。方法重载可以让类以相同的方式处理不同类型的数据。
- 覆盖(Override): 是指子类继承父类的方法后,可以根据需要对方法进行重新定义。覆盖的方法必须具有相同的方法名、参数列表以及返回值类型。
Java中重载的规则:
- 在同一个类中。
- 方法名必须相同。
- 参数类型、参数个数、参数顺序至少有一个不同。
- 返回类型可以相同也可以不同。
- 可以有不同的访问修饰符。
Java中覆盖的规则:
- 子类方法的返回类型、方法名和参数必须与父类被覆盖的方法相同。
- 子类方法不能缩小父类方法的访问权限。
- 方法可以声明为 final 或 static,如果声明为 final,则不能被覆盖;如果声明为 static,则不能被覆盖为非 static。
下面是一个重载和覆盖的例子:
class A {
void foo() {
System.out.println("foo() in A");
}
void foo(int i) {
System.out.println("foo(int i) in A: " + i);
}
}
class B extends A {
@Override
void foo() {
System.out.println("foo() in B");
}
// 这个方法是重载,不是覆盖,因为参数列表不同
void foo(int i, int j) {
System.out.println("foo(int i, int j) in B: " + i + ", " + j);
}
}
public class OverloadExample {
public static void main(String[] args) {
A a = new A();
a.foo(); // 调用 A 类的 foo()
a.foo(1); // 调用 A 类的 foo(int i)
B b = new B();
b.foo(); // 调用 B 类的 foo(),覆盖了 A 类的 foo()
b.foo(1); // 调用 A 类的 foo(int i),重载而非覆盖
b.foo(1, 2); // 调用 B 类的 foo(int i, int j),重载而非覆盖
}
}
在这个例子中,类 A 和类 B 分别定义了两个同名方法 foo()
,一个带有 int 参数,一个不带参数。类 B 继承自类 A 并覆盖了 foo()
方法,同时还定义了一个重载的 foo(int i, int j)
方法。在 main 方法中,我们创建了 A 和 B 的实例,并分别调用了它们的方法,以此来展示重载和覆盖的不同。
评论已关闭