- 编译器查看对象的声明类型和方法名。
假设调用的是x.f(param),x为C类隐式参数对象。编译器会一一列举C类中所有名为f的方法和其超类中访问属性为public且名为f的方法。(超类的私有方法不可访问)
public void raiseSalary(double byPercent) {
double raise = salary * byPercent/100;
salary += raise;
}
其中的this.salary为隐式参数,即出现在方法名前的类对象。byPercent为显示参数。很明显,显式参数是明显的列在方法中的,隐式参数没有出现在方法中。
- 编译器将查看调用方法时提供的参数类型。
? 如果在所有名为f的方法中存在一个方法的参数类型与调用方法提供的实参类型匹配,就选择这个方法,这个过程称为重载解析。若调用x.f("Hello"),则编译器会挑选f(String)。
- 静态绑定:如果是private方法、static方法、final方法或者构造器。那么编译器将可以准确的知道应该调用那个方法,我们将这种调用方式称为静态绑定。
动态绑定:调用的方法依赖于隐式参数的实际类型,并且在运行时实现调用那个方法,我们称这种调用方式为动态绑定。
- 当程序运行,并采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型最合适那个类的方法,假设x的实际类型是D,它是Cr的子类,如果D类定义了方法f(String),就直接调用它,否则将在D类的超类Father中寻找f(String),依次类推。即从子类到父类进行搜索。
原文地址:https://www.cnblogs.com/njuptzheng/p/11600950.html
时间: 2024-10-29 15:54:56