方法的调用过程

我们假设要调用a.m(args)方法,并且假定a为类C的对象。

  1. 编译器首先查看对象声名的类型和方法名。这里需要注意方法重载(Overload),编译器会一一列举C类中所有的名字为f的方法,以及C的超类中名字为f的方法(可以访问的,不能访问的不算,比如超类的private方法)。至此编译器知道了所有的候选方法
  2. 接下来,编译器要确定方法调用中提供的参数类型。如果所有名字为f的方法存在一个与调用参数完全匹配的,就选择这个方法。比如我们调用a.m("Jack"),编译器会选择m(String),而不是m(int)。由于存在类型的自动转换(比如byte自动转为int,子类会自动转为超类),情况会比较复杂。如果编译器没有找到类型一样的方法,或者发现经过类型转换之后可以找到多个方法与之匹配,编译器就会报错。
  3. 如果是private方法、static方法、final方法(final下一个小节介绍)或者构造器,那么编译器可以准确的知道应该调用哪个方法。这个叫静态绑定(static binding)。。与此对应的如果调用方法依赖于隐式参数的实际类型,那么就不是编译器的问题,而是运行期的问题,称作动态绑定。
posted @ 2020-04-21 17:17  hellowen2020  阅读(379)  评论(0)    收藏  举报