【Java基础】多态 -> 动态绑定的底层原理——虚方法表

一、方法表的定义

        方法表(Method Table)​ 是Java虚拟机(JVM)为每个类维护的一张表,用于存储该类所有方法的实际地址(指针)。它是实现动态绑定(Dynamic Binding)​ 的核心机制。通过方法表,JVM可以在运行时根据对象的实际类型确定调用哪个方法,尤其是在存在方法重写(Override)的情况下。

1. 方法表的结构

方法表是一个数组,每个元素存储了一个方法的实际地址(指针)。例如:

+-------------------+
|   Method Table    |
+-------------------+
| Index | Method    |
+-------+-----------+
|   0   | makeSound |
|   1   | fetch     |
|   2   | eat       |
+-------------------+
  • 索引(Index)​:数组的下标,用于唯一标识方法在表中的位置。
  • 方法(Method)​:数组的元素,存储了方法的实际地址。
2. 类比说明
  • 方法表就像一个数组,索引就是数组的下标。
  • 通过索引下标),可以快速访问数组中的元素方法地址)。

二、方法表的具体使用

1. 方法表的结构

方法表是一个数组,每个条目存储了一个方法的实际地址。方法表的内容包括:

  • 从父类继承的方法(如果子类没有重写,则指向父类的方法)。
  • 子类重写的方法(指向子类的方法)。
  • 子类新增的方法(添加到方法表的末尾)。
2. 方法表的示例

假设有以下类结构:

class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Dog barks");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Cat meows");
    }
}

 对应方法表结构如下:

+-------------------+       +-------------------+       +-------------------+
|   Animal Method   |       |    Dog Method     |       |    Cat Method     |
|      Table        |       |      Table        |       |      Table        |
+-------------------+       +-------------------+       +-------------------+
| Index | Method    |       | Index | Method    |       | Index | Method    |
+-------+-----------+       +-------+-----------+       +-------+-----------+
|   0   | makeSound |       |   0   | makeSound |       |   0   | makeSound |
|       | (Animal)  |       |       | (Dog)     |       |       | (Cat)     |
+-------------------+       +-------------------+       +-------------------+
  • Animal类的方法表:索引0指向Animal类的makeSound()方法。
  • Dog类的方法表:索引0指向Dog类的makeSound()方法(重写了Animal类的方法)。
  • Cat类的方法表:索引0指向Cat类的makeSound()方法(重写了Animal类的方法)。

 三、方法表的调用过程

+-------------------+       +-------------------+       +-------------------+
|   Animal myAnimal |       |    Dog Method     |       |    Cat Method     |
|       (Dog)       |       |      Table        |       |      Table        |
+-------------------+       +-------------------+       +-------------------+
         |                           |                           |
         |                           |                           |
         |                           |                           |
         v                           v                           v
+-------------------+       +-------------------+       +-------------------+
|   makeSound()     |       | Index | Method    |       | Index | Method    |
|   调用方法        |       +-------+-----------+       +-------+-----------+
+-------------------+       |   0   | makeSound |       |   0   | makeSound |
         |                  |       | (Dog)     |       |       | (Cat)     |
         |                  +-------------------+       +-------------------+
         |                          |
         |                          |
         |                          |
         +--------------------------+

详细调用步骤
​1. 对象创建
        Animal myAnimal = new Dog();
        myAnimal的实际类型是Dog。
2. ​方法调用
        myAnimal.makeSound();
        JVM查找Dog类的方法表。
3. ​方法查找
        在Dog类的方法表中,索引0对应的方法是Dog类的makeSound()。
4. ​方法执行
        执行Dog类的makeSound()方法,输出"Dog barks"。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值