【JVM类加载及字节码技术】栈中的执行过程-方法调用、多态(三)

一、方法调用

直接分析下面案例代码:

public class Demo5 {
	public Demo5() {
	}
	private void test1() {
	}
	private final void test2() {
	}
	public void test3() {
	}
	public static void test4() {
	}
	public static void main(String[] args) {
		Demo5 demo5 = new Demo5();
		demo5.test1();
		demo5.test2();
		demo5.test3();
		Demo5.test4();
	}
}

1、JVM底层对不同方法,有不同的实现方式

在JVM底层中不同的方法在调用的时候,对应的虚拟机指令也不同

  1. 私有(private)、构造方法、final修饰的方法

    在调用的时候都是使用 invokespecial 指令。

  2. 普通成员方法

    使用 invokespecial 指令。因为编译期间 无法确定 该方法的内容,只有在运行期间才能确定。

  3. 静态方法:

    在调用时使用 invokestatic 指令。

Code:
      stack=2, locals=2, args_size=1
         0: new           #2                  // class com/nyima/JVM/day5/Demo5 
         3: dup
         4: invokespecial #3                  // Method "<init>":()V
         7: astore_1
         8: aload_1
         9: invokespecial #4                  // Method test1:()V
        12: aload_1
        13: invokespecial #5                  // Method test2:()V
        16: aload_1
        17: invokevirtual #6                  // Method test3:()V
        20: invokestatic  #7                  // Method test4:()V
        23: return
  1. 第一条指令 new :创建一个【对象】,给【对象】分配内存空间,执行成功会将 【对象引用】压入操作数栈

  2. 第二条指令 dup复制操作数栈栈顶的内容,这里复制的就是这个对象引用,那么为什么需要需要复制呢?

    因为调用方法前,首先需要使用 invokespecial 调用init( )V方法,这里需要消耗掉栈顶的一份对象引用。另一份需要要 配合 astore_1 赋值给局部变量。

  3. 终方法(final),私有方法(private),构造方法都是由 invokespecial 指令来调用,属于静态绑定

  4. 普通成员方法是由 invokevirtual 调用,属于动态绑定,即支持多态。 成员方法与静态方法调用的另一个区别是,执行方法前是否需要【对象引用】

二、多态原理

因为普通成员方法需要在运行时才能确定具体的内容,所以虚拟机需要调用invokevirtual指令,即支持动态绑定,支持多态

在执行invokevirtual指令时,经历了以下几个步骤:

  1. 先通过栈帧中对象的引用找到对象。
  2. 分析对象头,找到对象的实际对象。
  3. Class结构中有vtable。
  4. 查询vtable找到方法的具体地址。
  5. 执行方法的字节码。

引用黑马JVM课程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值