Java方法调用过程

[size=medium]在学习Java过程中,弄清调用对象方法执行过程十分重要。

以下为调用的详细过程:

1.编辑器查看对象的声明类型和方法名。假如调用obj.x(param),并且obj被声明为C类的对象,由于Java方法重载这一特性,在C类中可能存在多个方法名为x、参数类型不同的方法。编辑器会列举出C类中所有名为x的方法以及C类的父类中访问属性不为private的名为x的方法。至此编辑器获取所有可能被调用的候选方法。

2.编辑器将查看调用方法时的参数类型。在之前获取到的候选方法列表中存在与调用方法参数完全匹配,那么就调用这个方法。这个过程被称为[b]重载解析(overloading resolution)[/b]。例如:对于调用obj.x("hello")来说,编辑器将会挑选x(String),而不是x(int)。
至此,编辑器获取到了需要调用的方法名称和参数类型。(方法名称和参数类型被称为方法签名。)

3.如果方法是private、static、final或者构造器,那么编辑器可以准确的知道调用哪个方法,这种方式称为[b]静态绑定[/b]。与之对应的是,调用哪个方法将依赖于具体的参数类型,并且在运行时动态绑定。如obj.x("hello")。

4.当程序运行时,并且采用动态绑定调用方法时,虚拟机一定调用与obj所引用的实际类型最为合适的那个方法。假设obj的实际类型为D,D类是C类的子类。如果D类定义了x(String)方法,则直接调用它,否则,将在D类的超类C类中寻找方法x(String)。
每次调用方法都要进行搜索,时间的开销非常大。因此,虚拟机预先为每个类创建了一个方法表。其中列出了所有的方法的签名,这样在每次真正调用方法的时候,虚拟机仅查找这个方法表就可以了。[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值