欢迎访问宙启技术站
智能推送

如何在Java中实现方法的覆盖和重写?

发布时间:2023-06-20 08:59:14

Java是一种面向对象编程的语言,其中最基本的概念之一就是方法的覆盖和重写。在Java中,继承是通过一个类继承另一个类来实现的。在继承的过程中,子类可以继承父类的方法,也可以覆盖或重写父类的方法。覆盖和重写的目的在于让子类的某些方法具有自己的实现,以达到特定的目的。

方法覆盖

方法覆盖是指在子类中重新定义(或更新)父类已有的方法。重载方法在方法名相同的情况下,根据参数类型和数量的差异,实现一个或多个版本的方法。如果方法被覆盖,子类会使用自己的实现版本,而不是父类的实现版本。这确保了程序运行时用正确的实现版本来执行特定的代码,以遵循特定的行为标准。

以下是Java中方法覆盖的示例。假设有一个父类A,其中定义了一个名为foo的方法:

public class A {
    public void foo() {
        System.out.println("A.foo()");
    }
}

现在,我们定义一个子类B,它继承自A,并重写foo方法:

public class B extends A {
    @Override
    public void foo() {
        System.out.println("B.foo()");
    }
}

我们可以看到,B覆盖了A的foo方法,并提供了自己的实现版本。当我们创建一个B类对象并调用foo方法时,将使用B版本的实现:

B b = new B();
b.foo();   // 输出 B.foo()

重写方法

重写方法是指子类在继承父类方法后,对该方法进行重新定义,对于方法名、参数列表和返回值类型等都相同,但子类的实现版本可以不同于父类的实现版本。当在子类中上给方法打上@Override注释时,就表明该方法是被重写的方法。

下面我们用一个实际的场景来介绍Java中如何重写方法。假设我们有一个父类Animal:

public class Animal {
    public void move() {
        System.out.println("动物可以移动");
    }
}

接下来,我们有子类Bird,它重写了Animal的move方法,为此子类补充了以下代码:

public class Bird extends Animal {
    @Override
    public void move() {
        System.out.println("鸟儿在飞翔");
    }
    public void sing() {
        System.out.println("鸟儿在唱歌");
    }
}

我们可以看到,Bird子类继承Animal父类的方法move(),然后对它进行了重写,替代它原本的实现,并将“动物可以移动”更改为“鸟儿在飞翔”。“鸟儿在唱歌”是Bird独有的方法,该方法可以被实例化后的Bird对象单独使用。

现在,我们创建了一个Bird对象来测试:

public static void main(String[] args) {
    Animal animal = new Animal();   // 创建 Animal 对象
    Bird bird = new Bird();      // 创建 Bird 对象
    animal.move();   // 执行 Animal 类的方法
    bird.move();     // 执行 Bird 类的方法
    bird.sing();     // 执行 Bird 类的 sing 方法
}

输出结果:

动物可以移动
鸟儿在飞翔
鸟儿在唱歌

在上面的示例中,Bird类重写了父类的move方法并为之提供了一个新的实现,结果是Animal对象的方法输出动物可以移动,而Bird对象的方法输出鸟儿在飞翔。这是因为我们通过重写方法,把父类已有的方法重新定义了一种新的实现方式。

继承中方法的调用顺序

继承中多个方法的调用顺序有指定规则。假设diedai类继承了zhizhi类,子类zhizhi继承父类fu。假设这三个类都有一个名为 foo 的方法,那么在调用 diedai.foo() 时,方法执行顺序如下:

1、首先查看 diedai 类中是否有 foo() 方法。如果有,则调用 diedai.foo()。

2、如果 diedai 类中没有 foo() 方法,那么查看 diedai 父类 zhizhi 中是否有 foo() 方法。如果有,则调用 zhizhi.foo()。

3、如果 diedai 类和 zhizhi 类中都没有 foo() 方法,那么查看 zhizhi 父类 fu 中是否有 foo() 方法。如果有,则调用 fu.foo()。

4、如果 diedai 和 zhizhi 类和 fu 类中都没有 foo() 方法,那么该方法就不存在,编译时将抛出错误。