53-通过字节码分析Java方法的静态分派与动态分派机制
程序员文章站
2024-03-16 23:13:46
...
通过字节码分析Java方法的静态分派与动态分派机制
方法的动态分派:
- 方法的动态分派涉及到一个重要的概念:方法接受者。
- 多态,运行期的行为,涉及到invokevirtual字节码指令的多态查找流程:
- 首先,到操作数的栈顶,去寻找到栈顶的元素所指向的这个对象的实际类型;
- 第二步:如果在上面的过程当中寻找到了与常量池当中的“这个描述符“[下面这段]
invokevirtual #6 <jvm/bytecode/Fruit.test>
和名称相同的这个方法,并且也具备一些相应的访问权限,那么,它就直接的返回这个目标方法的直接引用。
- 第三步:如果找不到,就按照继承的这种层次关系,从子类往父类,依次对他的各个父类重复的进行这种查找的流程,一直到真正的能够符合①②步要求的特定的对象的方法,然后去执行
- 如果上面的三步找不到,那就抛异常吧!
比较方法重载(overload)与方法重写(overwrite):可以得到下面的结论
- 方法重载是静态的,是编译器行为;方法重写是动态的,是运行期行为。
- 所以,Java中多态和方法重载并没有什么直接关系,相反,它和方法重写有着密不可分的关系。
public class MyTest6 {
public static void main(String[] args) {
Fruit apple = new Apple();
Fruit orange = new Orange();
apple.test();
orange.test();
apple = new Orange();
apple.test();
}
}
class Fruit{
public void test(){
System.out.println("Fruit");
}
}
class Apple extends Fruit{
@Override
public void test(){
System.out.println("Apple");
}
}
class Orange extends Fruit{
@Override
public void test(){
System.out.println("Orange");
}
}
运行结果:
Apple
Orange
Orange
反编译指令集: