弄清楚如何在对象上应用方法调用非常重要,下面是调用过程的详细描述
一、编译器查看对象的声明类型和方法名,在所有方法中有可能出现多个名字相同,但参数不一样的构造方法。编译器会意义列举所有当前类中的方法和其父类中访问属性为Public且名字与调用方法名相同的方法。
二、在执行第一步以后,编译器将会查看调用方法时提供的参数类型。如果在所有名与调用方法名相同的方法中存在一个与提供参数类型完全匹配,就选择这个方法。这个过程被称为 重载解析。如果编译器没有找到与参数类型类型匹配的方法,或者发现经过类型转换后有多个方法与之匹配,就会报告一个错误。
三、如果是private方法、static方法、final方法或者构造器,那么编译器将会准确的知道应该调用哪个方法,我们把它称为 静态绑定
静态绑定:也叫前期绑定,指编译时就可以回到方法所属的类,并与之建立连接
动态绑定:也叫后期绑定,指运行时才可以知道方法的实际类型,并与之建立连接。
四、当程序运行,并采用动态绑定调用方法时,虚拟机一定调用与类所引用对象的实际类型最合适的那个累的方法。假设x的实际类型是D,他是C类的子类。如果D预先定义了方法,就直接调用它,否则将会在D的父类C中寻找,以此类推。
事实上,虚拟机预先为每个类创建了一方法表(method table),其中列出了所有方法的签名和实际调用的方法。这样一来,在调用方法的时候,虚拟机仅查找这个表就行了。