📜  Java |继承|问题7(1)

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

Java继承问题7

在Java中,继承是一种重要的面向对象编程(OOP)概念。使用继承,我们可以利用已有类的属性和方法来创建新的类,而无需重新编写相同的代码。在这个主题中,我们将探讨Java的继承问题7。

问题

在Java中,如果子类的方法与父类的方法名称和参数都相同,但是返回类型不同,会出现什么情况?请给出一个示例程序。

解答

当子类的方法名称和参数与父类的方法相同,但是返回类型不同时,我们称之为“覆盖”。在Java中,方法的覆盖必须满足以下条件:

  • 子类方法的名称、参数数量、参数类型必须与父类方法相同。
  • 子类方法的访问修饰符不能低于父类方法的访问修饰符。
  • 子类方法不能抛出比父类方法更宽泛的异常。
  • 子类方法的返回类型可以是父类方法返回类型的子类。

下面是一个示例程序,演示如何在子类中覆盖父类方法,返回类型为子类类型。

class Animal {
    String getName() {
        return "Animal";
    }
}

class Dog extends Animal {
    @Override
    String getName() {
        return "Dog";
    }
}

public class Main {
    public static void main(String[] args) {
        Animal a = new Animal();
        Dog d = new Dog();
        Animal ad = new Dog();

        System.out.println(a.getName());  // 输出 "Animal"
        System.out.println(d.getName());  // 输出 "Dog"
        System.out.println(ad.getName()); // 输出 "Dog"
    }
}

在这个示例中,我们定义了一个名为Animal的父类和一个名为Dog的子类。Animal类具有一个名为getName()的方法,返回类型为String,并且返回一个字符串"Animal"。在子类Dog中,我们覆盖了getName()方法,并将其返回类型更改为String的子类(即"Dog")。在主类Main中,我们创建了三个实例:一个Animal类型的对象a,一个Dog类型的对象d和一个Animal类型的对象ad,并分别调用它们的getName()方法。输出表明,a.getName()返回"Animal"d.getName()返回"Dog"ad.getName()返回"Dog"。这表明,如果子类的覆盖方法的返回类型是父类方法的子类型,则可以使用该子类型的实例返回覆盖方法。