Java 当父类的一个方法在子类中被重写时,父类如何工作?
当一个子类重写多个方法并调用其父类中的一个方法时,父类是使用它自己的预定义方法还是子类已重写的方法 在某些情况下,举个例子,我的问题源自AP计算机科学课程中的这个问题。下面,当调用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();
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()
,否则不能再次调用超类的方法。这有点误导,因为这意味着您可以绕过从另一个方法调用重写方法。尝试时会发生什么?