Java基础-方法调用的过程

文章讲述了方法调用的过程,从对象的实际类型开始查找,如果未找到则向上查找父类,这一机制称为动态绑定。为了优化效率,系统使用虚方法表,每个类在加载时创建一个记录所有动态绑定方法的表,调用时直接查找表,提高速度。文章以一个示例说明了虚方法表的工作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法调用的过程

我们先来看c.action();,这句代码的执行过程:

1)查看c的对象类型,找到Child类型,在Child类型中找action方法,发现没有,到父类中寻找;

2)在父类Base中找到了方法action,开始执行action方法;

3)action先输出了start,然后发现需要调用step()方法,就从Child类型开始寻找step()方法;

4)在Child类型中找到了step()方法,执行Child中的step()方法,执行完后返回action方法;

5)继续执行action方法,输出end。

寻找要执行的实例方法的时候,是从对象的实际类型信息开始查找的,找不到的时候,再查找父类类型信息。

我们来看b.action(),这句代码的输出和c.action()是一样的,这称为动态绑定,而动态绑定实现的机制就是根据对象的实际类型查找要执行的方法,子类型中找不到的时候再查找父类。

这里,因为b和c指向相同的对象,所以执行结果是一样的。

如果继承的层次比较深,要调用的方法位于比较上层的父类,则调用的效率是比较低的,因为每次调用都要进行很多次查找。大多数系统使用一种称为虚方法表

的方法来优化调用的效率。

所谓虚方法表,就是在类加载的时候为每个类创建一个表,记录该类的对象所有动态绑定的方法(包括父类的方法)及其地址,但一个方法只有一条记录,子类重写了父类方法后只会保留子类的。对于本例来说,Child和Base的虚方法表如图4-5所示。

图4-5 继承原理:虚方法表

对Child类型来说,action方法指向Base中的代码,toString方法指向Object中的代码,而step()指向本类中的代码。当通过对象动态绑定方法的时候,只需要查找这个表就可以了,而不需要挨个查找每个父类。接下来,我们介绍变量访问的过程。

https://www.bilibili.com/video/BV12x4y1j7rq/?spm_id_from=333.999.0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值