主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

Java 方法重写

在上一章中,我们介绍了继承的基本概念。继承是面向对象编程(OOP)的一项重要特性,它允许我们基于现有的类(称为基类)派生出新的类(称为子类)。子类能够自动继承基类的属性和方法,从而支持代码复用和层次化类结构的设计。

在继承机制中,如果子类定义了与父类同名的方法,则子类方法会覆盖父类中的对应方法。这一特性被称为方法重写(Method Overriding)。方法重写是实现运行时多态的关键技术,允许子类根据自身需求定制特定的行为逻辑。

Java 方法重写结构图


什么是方法重写?

方法重写是指子类重新定义父类中已经定义的方法,以改变或扩展该方法的行为。重写后的方法:

  • 具有与父类方法相同的方法签名(方法名和参数列表)
  • 提供不同的方法实现
  • 在运行时根据对象实际类型调用相应版本

✅ 以下是一个展示 Java 方法重写(Override)基本用法的简明实例:

java
复制
class Animal {
    public void displayInfo() {
        System.out.println("I am an animal.");
    }
}

class Cat extends Animal {
    @Override
    public void displayInfo() {
        System.out.println("I am a cat.");
    }
}

class Main {
    public static void main(String[] args) {
        Cat tabbyCat = new Cat();
        tabbyCat.displayInfo();
    }
}

执行上面的程序后,运行结果:

I am a cat.

在上面的代码中,Animal 类定义了一个名为 displayInfo() 的方法。子类 Cat 通过重写该方法,提供了自己的实现。当我们创建 Cat 类的实例并调用 displayInfo() 方法时,输出结果显示的是子类中的实现,而不是父类中的实现。


方法重写的规则

1. 基本规则

  • 方法签名必须完全相同(方法名和参数列表)
  • 返回类型可以是父类方法返回类型的子类(协变返回类型,Java 5+)
  • 访问修饰符不能比父类方法更严格:
    父类public→ 子类必须public
    父类protected→ 子类protectedpublic
    父类默认(包私有)→ 子类不能是private
  • 不能抛出比父类方法更多的检查异常(可以抛出更少或子类异常)
  • 不能重写 finalstaticprivate方法

2. 协变返回类型(Covariant Return Type)

Java 5 开始支持协变返回类型,允许重写方法返回父类方法返回类型的子类:

java
复制
class Fruit {
    protected Number getWeight() {
        return 100;
    }
}

class Apple extends Fruit {
    @Override
    public Integer getWeight() {  // Integer是Number的子类
        return 150;
    }
}

3. 异常处理规则

java
复制
class Parent {
    protected void process() throws IOException {
        // ...
    }
}

class ValidChild extends Parent {
    @Override
    protected void process() throws FileNotFoundException {  // FileNotFoundException是IOException的子类
        // ...
    }
}

class InvalidChild extends Parent {
    @Override
    protected void process() throws Exception {  // 编译错误:Exception比IOException更宽
        // ...
    }
}

4. @Override 注解

虽然@Override注解不是必须的,但依然强烈建议使用:

  • 帮助编译器检查是否确实重写了父类方法
  • 提高代码可读性
  • 防止因拼写错误导致意外创建新方法
java
复制
class Bird {
    public void fly() {
        System.out.println("鸟儿飞翔");
    }
}

class Penguin extends Bird {
    @Override
    public void fly() {
        System.out.println("企鹅不会飞");
    }

    // 如果没有 @Override,下面的拼写错误不会被发现
    // public void flay() {  // 本意是重写fly,但拼写错误
    //     System.out.println("拼写错误的方法");
    // }
}


评论区 0
发表评论