📜  函数覆盖(1)

📅  最后修改于: 2023-12-03 15:07:08.927000             🧑  作者: Mango

函数覆盖

在面向对象编程中,子类可以继承父类的方法,甚至可以覆盖(重写)父类的方法。这就是函数覆盖(Function Overriding),也称为方法覆盖、多态性。

概述

函数覆盖的基本概念是子类定义一个与父类同名的方法,但是实现和语义不同。这意味着在父类和子类对象上调用同名方法时,它们将表现出不同的行为。

换句话说,子类可以改变从父类继承来的方法的实现方式。这样做的优点是,通过函数覆盖,我们可以根据实际需要重新定义父类方法的行为,从而实现更高效、更符合需求的程序。

函数覆盖的要求
  1. 函数的名称和参数列表必须与父类的函数完全相同。例如,如果父类的方法是public void run(),那么子类的方法就必须是public void run(),不能是public void start()public void run(int speed)

  2. 函数的访问权限不能比父类的更严格。例如,如果父类的方法是public,那么子类的方法也必须是publicprotected,不能是private

  3. 函数的返回类型必须与父类的函数相同,或者是它的子类。例如,如果父类的方法返回一个对象,那么子类的方法可以返回该对象的子类。

示例
class Animal {
    public void run() {
        System.out.println("Animal is running!");
    }
}

class Dog extends Animal {
    @Override
    public void run() {
        System.out.println("Dog is running!");
    }
}

class Cat extends Animal {
    @Override
    public void run() {
        System.out.println("Cat is running!");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal animal2 = new Dog();
        Animal animal3 = new Cat();

        animal1.run(); // 输出:Animal is running!
        animal2.run(); // 输出:Dog is running!
        animal3.run(); // 输出:Cat is running!
    }
}

上述代码中,我们定义了Animal类作为父类,有一个run()方法,输出“Animal is running!”。同时,子类DogCat都继承了Animal类,覆盖了它的run()方法,输出了“Dog is running!”和“Cat is running!”。

Test类中,我们定义了三个Animal类型的对象,分别是animal1animal2animal3。其中,animal1Animal类的对象,animal2Dog类的对象,animal3Cat类的对象。分别调用它们的run()方法,输出了不同的结果。

这说明尽管我们定义了三个不同的对象,但是它们调用同名的run()方法时,表现出了不同的行为。这就是函数覆盖的本质。

总结

函数覆盖是面向对象编程中的一个重要概念,它允许子类覆盖从父类继承来的方法,实现不同的行为。要实现函数覆盖,子类必须遵守一些规则,其中最重要的是函数的名称和参数列表必须与父类完全相同。通过函数覆盖,我们可以更加灵活地使用面向对象编程的特性,实现更高效、更符合需求的程序。