面试题答案
一键面试动态绑定概念
在Java中,动态绑定(Dynamic Binding),也称为运行时多态性,是指在运行时根据对象的实际类型来确定调用哪个方法。Java通过方法重写(Override)实现动态绑定。当子类重写了父类的方法,并且通过父类引用调用该方法时,实际执行的是子类中重写的方法。这一过程依赖于对象的实际类型,而不是引用类型。
方法重载概念
方法重载(Method Overloading)是指在同一个类中,多个方法可以具有相同的名称,但参数列表(参数的数量、类型或顺序)必须不同。编译器在编译时根据调用方法时传入的参数来确定调用哪个重载方法。这是一种编译时多态性。
协同工作示例
假设存在以下类继承结构:
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
public void makeSound(String sound) {
System.out.println("Dog " + sound);
}
}
class Puppy extends Dog {
@Override
public void makeSound() {
System.out.println("Puppy whines");
}
}
在上述代码中,Animal
类有一个 makeSound
方法,Dog
类继承自 Animal
并重写了 makeSound
方法,同时还定义了一个重载的 makeSound
方法。Puppy
类又继承自 Dog
并重写了 makeSound
方法。
调用方法时编译器和运行时系统的工作
- 编译器工作:
- 在编译阶段,编译器根据对象引用的类型和方法调用时传入的参数来确定可能调用的方法集合,这个过程只考虑引用类型和参数列表。例如:
Animal animal1 = new Dog();
animal1.makeSound(); // 编译器确定可能调用Animal类的makeSound方法
Dog dog1 = new Puppy();
dog1.makeSound("growls"); // 编译器确定可能调用Dog类的makeSound(String sound)方法
- 运行时系统工作:
- 在运行时,Java虚拟机(JVM)根据对象的实际类型来确定具体执行的方法。继续上面的例子:
Animal animal1 = new Dog();
animal1.makeSound(); // 运行时,实际类型是Dog,所以执行Dog类重写的makeSound方法,输出“Dog barks”
Dog dog1 = new Puppy();
dog1.makeSound("growls"); // 运行时,实际类型是Puppy,但由于方法是根据引用类型Dog和参数选择的,所以执行Dog类的makeSound(String sound)方法,输出“Dog growls”
在多层继承和多个重载方法的场景下,编译器先根据引用类型和参数确定候选方法集合,运行时系统再根据对象实际类型从候选方法集合中确定最终执行的方法,从而实现方法重载和动态绑定的协同工作。