📅  最后修改于: 2023-12-03 15:07:08.927000             🧑  作者: Mango
在面向对象编程中,子类可以继承父类的方法,甚至可以覆盖(重写)父类的方法。这就是函数覆盖(Function Overriding),也称为方法覆盖、多态性。
函数覆盖的基本概念是子类定义一个与父类同名的方法,但是实现和语义不同。这意味着在父类和子类对象上调用同名方法时,它们将表现出不同的行为。
换句话说,子类可以改变从父类继承来的方法的实现方式。这样做的优点是,通过函数覆盖,我们可以根据实际需要重新定义父类方法的行为,从而实现更高效、更符合需求的程序。
函数的名称和参数列表必须与父类的函数完全相同。例如,如果父类的方法是public void run()
,那么子类的方法就必须是public void run()
,不能是public void start()
或public void run(int speed)
。
函数的访问权限不能比父类的更严格。例如,如果父类的方法是public
,那么子类的方法也必须是public
或protected
,不能是private
。
函数的返回类型必须与父类的函数相同,或者是它的子类。例如,如果父类的方法返回一个对象,那么子类的方法可以返回该对象的子类。
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!”。同时,子类Dog
和Cat
都继承了Animal
类,覆盖了它的run()
方法,输出了“Dog is running!”和“Cat is running!”。
在Test
类中,我们定义了三个Animal
类型的对象,分别是animal1
、animal2
和animal3
。其中,animal1
是Animal
类的对象,animal2
是Dog
类的对象,animal3
是Cat
类的对象。分别调用它们的run()
方法,输出了不同的结果。
这说明尽管我们定义了三个不同的对象,但是它们调用同名的run()
方法时,表现出了不同的行为。这就是函数覆盖的本质。
函数覆盖是面向对象编程中的一个重要概念,它允许子类覆盖从父类继承来的方法,实现不同的行为。要实现函数覆盖,子类必须遵守一些规则,其中最重要的是函数的名称和参数列表必须与父类完全相同。通过函数覆盖,我们可以更加灵活地使用面向对象编程的特性,实现更高效、更符合需求的程序。