2019.09.27 随笔(方法调用)

第一步 编译器查看对象的声明类型和方法名。
假设调用的是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),依次类推。即从子类到父类进行搜索。

posted @ 2019-09-27 23:06  梧桐更兼细雨_到黄昏  Views(103)  Comments(0Edit  收藏  举报