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