MST

星途 面试题库

面试题:Java多态中方法表如何影响方法调用

请简述在Java多态场景下,方法表是怎样确定最终要调用的方法的?可以结合具体代码示例说明。
13.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在Java多态场景下,方法表用于确定最终要调用的方法,其过程如下:

  1. 编译期:Java编译器在编译时,会根据对象声明的类型来查找方法签名。此时,编译器只知道对象声明类型中定义的方法,并不关心实际对象的运行时类型。
  2. 运行期:在运行时,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方法,DogCat类继承自Animal并重写了makeSound方法。在main方法中,animal1animal2声明为Animal类型,但实际分别是DogCat类型。当调用makeSound方法时,JVM根据对象的实际类型,在对应的方法表中找到重写后的makeSound方法并调用,从而实现多态。