在对象上应用方法调用
- 编译器查看对象的声明类型和方法名,获得所有可能被调用的候选方法
接下来,编译器将查看调用方法时提供的参数类型。如果在所有名相应的方法中存在一个与提供的参数类型完全匹配,就选择这个方法。这个过程被称为重载解析(overloading resolution)。如果编译器没有找到与参数类型匹配的方法,或者发现经过类型转后有多个方法与之匹配,就会报告错误
如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确的知道应该调用哪个方法,这种调用方式称为静态绑定(static binding)。
调用的方法依赖隐式参数的实际类型,并且在运行时实现动态绑定。
隐式参数又称方法的调用目标或接受者当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与隐式参数所引用对象的实际类型最合适的那个方法。
每次调用方法都要进行搜索,时间开销相当大。因此,虚拟机就预先为每个类创建了一个方法表(method table),其中列出了所有方法的签名和实际调用的方法。这样一来,在真正调用方法的时候,虚拟机仅查找这个表就行了。如果调用超类的方法,编译器将对隐式参数超类的方法表进行搜索
所以实际在调用某个对象变量的方法时的解析过程为:
- 首先虚拟机提取该对象变量的实际类型的方法表。
- 接下来开虚拟机搜索定义该方法签名的类,此时,虚拟机已经知道应该调用哪个方法
- 最后,虚拟机调用方法