您的位置:首页 > 博客中心 > 编程语言 >

Java中对象调用方法的顺序

时间:2022-03-29 01:41

Java虚拟机会预先为加载到内存中的每个类维护一个方法表(Method Table),其中列出了所有类中所有方法的签名。

现在有2个类A和B,其中,B是A的子类,和一个B类型的对象x,当调用x.f(args)时:

1.获取候选方法

首先,编译器会查看对象的类型和被调用的方法名。编译器会在在B类及其超类A的方法表中,找到所有名字为f的方法。

现在,编译知道了所有可能被调用的候选方法

2.重载解析

编译器根据方法调用中提供的参数数量与类型,从候选方法中查找与其匹配的方法,这个过程称为“重载解析”。

这里的匹配包含完全匹配与类型兼容2种含义,也就是说,如果实际参数的类型是方法参数的子类(或实现了的接口类型),或者是可以进行自动类型转换的基础类型,这里也可以称为匹配。

如果没有找到与实参匹配的方法,编译器就会报错。

现在,编译器已经找到了需要调用的方法的方法签名。

3.判断方法是静态绑定还是动态绑定

如果方法是private,static,final修饰的,或者是构造器方法,那么就是静态绑定的。

否则就需要依赖于隐式参数的实际类型,在运行时使用动态绑定。

如果是静态绑定的方法,就可以直接确定要执行的方法了;否则,进行下一步。

4.确定动态绑定要执行的方法

对于动态绑定的方法,优先调用当前类中匹配到的方法;如果当前类中没有满足方法签名的方法,就在超类中进行查找,以此类推。

本类排行

今日推荐

热门手游