重写(Override)和重载(Overload)是面向对象编程中两个重要的概念,主要区别如下:
重写(Override)
-
定义:子类重新定义父类中已有的方法
-
作用:实现多态性,子类可以根据需要改变继承自父类的方法实现
-
特点:
-
方法名、参数列表和返回类型必须完全相同
-
访问修饰符不能比父类更严格
-
只能重写非静态方法
-
发生在继承关系的类之间
-
重载(Overload)
-
定义:在同一个类中创建多个同名但参数不同的方法
-
作用:提供方法使用的灵活性,可以用相同的方法名处理不同类型的数据
-
特点:
-
方法名必须相同
-
参数列表必须不同(类型、数量或顺序)
-
返回类型可以不同
-
访问修饰符可以不同
-
发生在同一个类中
-
示例代码
// 重载示例
class OverloadExample {
void display(int a) {
System.out.println("整数: " + a);
}
void display(String a) { // 重载display方法
System.out.println("字符串: " + a);
}
}
// 重写示例
class Parent {
void show() {
System.out.println("父类方法");
}
}
class Child extends Parent {
@Override
void show() { // 重写show方法
System.out.println("子类方法");
}
}
关键区别总结
特性 | 重写(Override) | 重载(Overload) |
---|---|---|
发生位置 | 子类与父类之间 | 同一个类中 |
方法签名 | 必须完全相同 | 必须不同 |
返回类型 | 必须相同或协变 | 可以不同 |
访问权限 | 不能比父类更严格 | 可以不同 |
抛出异常 | 不能抛出更多/更广的异常 | 可以不同 |
目的 | 实现多态 | 提供方法使用的灵活性 |