4

当子类覆盖多个方法并调用其父类中的方法时,父类是使用它自己的预定义方法还是子类已覆盖的方法?

对于某些上下文和示例,我的问题源于 AP 计算机科学课程中的这个问题。下面,当super.act()被调用时,act来自Dog调用的方法eat()。该eat调用是否转到or中的eat方法?DogUnderDdog

考虑以下两个类。

public class Dog
{
    public void act() {
        System.out.print("run");
        eat();
    }

    public void eat() {
        System.out.print("eat");
    }
}

public class UnderDog extends Dog
{
    public void act() {
        super.act();
        System.out.print("sleep");
    }

    public void eat() {
        super.eat();
        System.out.print("bark");
    }
}

假设以下声明出现在客户端程序中。

Dog fido = new UnderDog();

调用的结果是fido.act()什么?

  1. run eat
  2. run eat sleep
  3. run eat sleep bark
  4. run eat bark sleep
  5. 由于无限递归,没有打印任何内容。
4

2 回答 2

3

子类可以通过两种方式调用超类方法:

  • 调用超类中定义的方法作为自己的方法,或
  • 调用超类中定义的方法,专门请求超类的行为

第一种方式的语法如下:

act(); // it's the same as this.act()

第二种调用方式的语法如下:

super.act();

我认为现在您有足够的信息来追踪您的示例中发生的事情,而无需进一步的帮助。

于 2012-05-06T23:55:52.183 回答
0

每当调用一个方法时——无论是在类的层次结构中还是在其他不相关的类中定义的——多态性就会发挥作用。从实例的实际类开始搜索目标方法并向上移动继承层次结构。

唯一一次绕过它是从使用覆盖它的方法调用被覆盖的方法时super

于 2012-05-07T00:15:27.573 回答