MST

星途 面试题库

面试题:Java动态绑定在复杂继承体系中的应用

假设有一个复杂的Java继承体系,A类是所有类的基类,B类继承自A类,C类继承自B类,D类和E类又分别继承自C类。每个类都有一个名为 'execute' 的方法,且都进行了方法重写。在一个方法中,定义了一个A类型的变量,并根据不同的条件将其赋值为B、D、E类型的实例对象,然后调用 'execute' 方法。请分析这个过程中动态绑定是如何工作的,并且说明如果在A类的 'execute' 方法中有一些通用的初始化逻辑,如何在不重复代码的情况下在子类的 'execute' 方法中复用这些逻辑。
20.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

动态绑定的工作原理

  1. 编译时:当编译器看到 A 类型的变量调用 execute 方法时,它会在 A 类中查找 execute 方法。因为 A 类确实有 execute 方法,所以编译通过。这里编译器只关心变量的声明类型,即 A 类型。
  2. 运行时:根据实际赋给 A 类型变量的对象的实际类型(如 BDE 类型的实例)来决定调用哪个类的 execute 方法。这就是动态绑定。Java 虚拟机(JVM)在运行时会检查对象的实际类型,然后调用对应实际类型类中重写的 execute 方法。例如,如果 A 类型的变量实际指向一个 D 类的实例,那么运行时就会调用 D 类中的 execute 方法。

在子类中复用A类execute方法的通用初始化逻辑

在子类的 execute 方法中,可以通过调用 super.execute() 来复用 Aexecute 方法中的通用初始化逻辑。例如:

class B extends A {
    @Override
    public void execute() {
        super.execute(); // 调用A类的execute方法,执行通用初始化逻辑
        // B类特有的逻辑
    }
}
class D extends C {
    @Override
    public void execute() {
        super.execute(); // 调用C类的execute方法,C类的execute方法又会调用B类的execute方法,最终调用A类的execute方法执行通用初始化逻辑
        // D类特有的逻辑
    }
}
class E extends C {
    @Override
    public void execute() {
        super.execute(); // 调用C类的execute方法,C类的execute方法又会调用B类的execute方法,最终调用A类的execute方法执行通用初始化逻辑
        // E类特有的逻辑
    }
}

这样在每个子类的 execute 方法中,通过 super.execute() 调用父类的 execute 方法,就可以保证通用初始化逻辑被执行,而不需要在每个子类中重复编写。