MST
星途 面试题库

面试题:Java多态方法重载在复杂继承体系下的解析

假设有一个复杂的Java继承体系,顶层父类A有一个方法 `void doSomething()`,子类B、C继承自A并分别对 `doSomething()` 进行方法重载,同时存在子类D继承自B,子类E继承自C,并且D和E又各自对 `doSomething()` 方法有不同的重载实现。在一个包含A、B、C、D、E类型对象的集合中,编写代码遍历该集合,并根据对象实际类型调用合适的 `doSomething()` 重载方法。详细解释在这个过程中,Java的动态绑定和方法重载机制是如何协同工作的。
30.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

以下是实现代码:

import java.util.ArrayList;
import java.util.List;

class A {
    void doSomething() {
        System.out.println("A's doSomething");
    }
}

class B extends A {
    @Override
    void doSomething() {
        System.out.println("B's doSomething");
    }
}

class C extends A {
    @Override
    void doSomething() {
        System.out.println("C's doSomething");
    }
}

class D extends B {
    @Override
    void doSomething() {
        System.out.println("D's doSomething");
    }
}

class E extends C {
    @Override
    void doSomething() {
        System.out.println("E's doSomething");
    }
}

public class Main {
    public static void main(String[] args) {
        List<A> list = new ArrayList<>();
        list.add(new A());
        list.add(new B());
        list.add(new C());
        list.add(new D());
        list.add(new E());

        for (A obj : list) {
            obj.doSomething();
        }
    }
}

动态绑定和方法重载机制协同工作解释:

  1. 方法重载
    • 在继承体系中,子类B、C、D、E对父类A的doSomething方法进行了重写(这里不是重载,重载是指在同一个类中方法名相同但参数列表不同的方法定义,此处是重写,即子类中重新实现父类的方法)。这是Java多态性的一种体现,通过重写,子类可以根据自身需求定制父类方法的行为。
  2. 动态绑定
    • 在遍历集合时,for (A obj : list)obj的编译时类型是A,但运行时类型是实际添加到集合中的对象类型,如BCDE等。
    • 当执行obj.doSomething()时,Java的动态绑定机制起作用。在运行时,JVM会根据obj实际指向的对象类型(而不是声明类型A)来确定调用哪个具体的doSomething方法。例如,如果obj实际指向的是D类型的对象,就会调用D类中重写的doSomething方法,而不是A类中的方法。这使得程序能够根据对象的实际类型执行合适的方法,实现了运行时的多态性。