Java方法重写
外观
简介[编辑 | 编辑源代码]
方法重写(Method Overriding)是Java面向对象编程中多态性的核心实现方式之一,指子类重新定义父类中已有的方法(非private
、final
或static
方法),以满足子类的特定需求。重写后的方法必须与父类方法具有相同的名称、参数列表和返回类型(或协变返回类型)。
核心特点[编辑 | 编辑源代码]
- 继承关系:仅发生在子类与父类之间。
- 方法签名一致:方法名、参数类型及顺序必须完全相同。
- 访问权限不能更严格:子类方法的访问修饰符不能比父类更严格(例如父类为
protected
,子类可为public
,但不能为private
)。 - 异常限制:子类方法抛出的受检异常不能比父类更广泛。
语法规则[编辑 | 编辑源代码]
class Parent {
void display() {
System.out.println("Parent's display");
}
}
class Child extends Parent {
@Override // 注解可选,但推荐用于编译器检查
void display() {
System.out.println("Child's display");
}
}
输出示例[编辑 | 编辑源代码]
public class Main {
public static void main(String[] args) {
Parent obj = new Child();
obj.display(); // 输出: Child's display
}
}
- 解释**:通过父类引用调用
display()
时,实际执行的是子类重写后的方法,体现了运行时多态。
- 解释**:通过父类引用调用
实际应用场景[编辑 | 编辑源代码]
案例1:图形类计算面积[编辑 | 编辑源代码]
class Shape {
double getArea() {
return 0;
}
}
class Circle extends Shape {
private double radius;
Circle(double r) { this.radius = r; }
@Override
double getArea() {
return Math.PI * radius * radius;
}
}
- 使用场景**:不同子类(如
Square
、Triangle
)可重写getArea()
实现各自的计算逻辑。
- 使用场景**:不同子类(如
案例2:支付系统多态调用[编辑 | 编辑源代码]
abstract class Payment {
abstract void processPayment(double amount);
}
class CreditCardPayment extends Payment {
@Override
void processPayment(double amount) {
System.out.println("Processing credit card payment: $" + amount);
}
}
- 优势**:通过统一的接口调用不同支付方式(如
PayPalPayment
),增强代码扩展性。
- 优势**:通过统一的接口调用不同支付方式(如
方法重写 vs 方法重载[编辑 | 编辑源代码]
特性 | 方法重写 | 方法重载 |
---|---|---|
作用范围 | 父子类之间 | 同一类内 |
方法签名 | 必须相同 | 必须不同(参数列表) |
多态性 | 运行时多态 | 编译时多态 |
高级主题[编辑 | 编辑源代码]
协变返回类型[编辑 | 编辑源代码]
Java 5+ 允许子类重写方法时返回父类方法返回类型的子类型:
class Animal {
Animal reproduce() { return new Animal(); }
}
class Dog extends Animal {
@Override
Dog reproduce() { return new Dog(); } // 协变返回类型
}
@Override
注解的作用[编辑 | 编辑源代码]
- 显式声明方法重写意图。
- 编译器检查:若方法签名不匹配父类方法,会报错。
常见错误与陷阱[编辑 | 编辑源代码]
1. 误用静态方法:静态方法不能被重写(实际是隐藏)。
class Parent { static void method() {} }
class Child extends Parent { static void method() {} } // 隐藏而非重写
2. 违反访问权限:
class Parent { protected void method() {} }
class Child extends Parent { private void method() {} } // 编译错误
总结[编辑 | 编辑源代码]
方法重写是Java实现多态的关键机制,通过子类定制父类行为,提升代码灵活性和可维护性。正确使用时需严格遵守签名一致性、访问权限和异常处理规则。