面试题答案
一键面试在Java多态场景下,方法表用于确定最终要调用的方法,其过程如下:
- 编译期:Java编译器在编译时,会根据对象声明的类型来查找方法签名。此时,编译器只知道对象声明类型中定义的方法,并不关心实际对象的运行时类型。
- 运行期:在运行时,Java虚拟机(JVM)会根据对象的实际类型来确定调用哪个方法。这一过程涉及到动态绑定(dynamic binding),JVM通过方法表(method table)来实现动态绑定。
- 每个类都有一个方法表,它包含了该类及其所有超类中定义的方法的实际地址。方法表在类加载时创建。
- 当通过对象调用方法时,JVM首先根据对象的实际类型找到对应的方法表,然后在方法表中查找与编译期确定的方法签名匹配的方法,找到后调用该方法的实际地址。
以下是具体代码示例:
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");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat meows");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.makeSound(); // 运行时,JVM根据animal1实际类型Dog,在Dog的方法表中找到makeSound方法并调用
animal2.makeSound(); // 运行时,JVM根据animal2实际类型Cat,在Cat的方法表中找到makeSound方法并调用
}
}
在上述代码中,Animal
类有makeSound
方法,Dog
和Cat
类继承自Animal
并重写了makeSound
方法。在main
方法中,animal1
和animal2
声明为Animal
类型,但实际分别是Dog
和Cat
类型。当调用makeSound
方法时,JVM根据对象的实际类型,在对应的方法表中找到重写后的makeSound
方法并调用,从而实现多态。