一、方法表的定义
方法表(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"。
542

被折叠的 条评论
为什么被折叠?



