跳转到内容

Java方法重写

来自代码酷

模板:编程概念导航

简介[编辑 | 编辑源代码]

方法重写(Method Overriding)是Java面向对象编程中多态性的核心实现方式之一,指子类重新定义父类中已有的方法(非privatefinalstatic方法),以满足子类的特定需求。重写后的方法必须与父类方法具有相同的名称、参数列表和返回类型(或协变返回类型)。

核心特点[编辑 | 编辑源代码]

  • 继承关系:仅发生在子类与父类之间。
  • 方法签名一致:方法名、参数类型及顺序必须完全相同。
  • 访问权限不能更严格:子类方法的访问修饰符不能比父类更严格(例如父类为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;  
    }  
}
    • 使用场景**:不同子类(如SquareTriangle)可重写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实现多态的关键机制,通过子类定制父类行为,提升代码灵活性和可维护性。正确使用时需严格遵守签名一致性、访问权限和异常处理规则。

模板:Java学习路径结构