Java 当父类的一个方法在子类中被重写时,父类如何工作?

Java 当父类的一个方法在子类中被重写时,父类如何工作?,java,inheritance,Java,Inheritance,当一个子类重写多个方法并调用其父类中的一个方法时,父类是使用它自己的预定义方法还是子类已重写的方法 在某些情况下,举个例子,我的问题源自AP计算机科学课程中的这个问题。下面,当调用super.act()时,来自Dog的act方法调用eat()。该eat调用是否转到Dog或ddog下的eat方法 考虑以下两个类 public class Dog { public void act() { System.out.print("run"); eat();

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

在某些情况下,举个例子,我的问题源自AP计算机科学课程中的这个问题。下面,当调用
super.act()
时,来自
Dog
act
方法调用
eat()。该
eat
调用是否转到
Dog
或ddog
下的
eat
方法

考虑以下两个类

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()
的结果是什么

  • runeat
  • run eat sleep
  • run-eat-sleep-bark
  • run eat bark sleep
  • 由于无限递归,不会打印任何内容

  • 子类调用超类方法有两种方式:

    • 调用超类中定义为自己的方法,或
    • 调用在超类中定义的方法,该方法专门请求超类的行为
    第一种方式的语法如下所示:

    act(); // it's the same as this.act()
    
    super.act();
    
    第二种调用方式的语法如下所示:

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

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

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


    唯一一次被忽略的是,当从使用
    super

    覆盖它的方法调用被覆盖的方法时,我意识到,我想知道的是,当调用super.act()时,它调用eat();那吃法叫狗里吃还是狗下吃?为什么?@user577829当
    Dog
    调用
    eat
    时,它调用子类中定义的一个,因为这是一个隐式
    this.eat()
    ,而
    this
    UnderDog
    及其所有方法的一个实例。因此,即使代码来自Dog,它的运行方式类似于Java中UnderDog?@user577829中定义的方法,一旦覆盖了某个方法,它就会被覆盖。除非子类显式调用
    super.someMethod()
    ,否则不能再次调用超类的方法。这有点误导,因为这意味着您可以绕过从另一个方法调用重写方法。尝试时会发生什么?