对象方法的调用执行过程
编译器查看对象的声明类型和方法名。假设调用x.f(param),隐式参数为x声明为C类对象,需要注意的是,有可能存在多个方法名为f,但是参数不同的方法,此时,编译器会一一列举C类中的所有方法名为f的方法和超类中访问属性为public的并且名字为f的方法。
接下来,编译器将查看调用方法时提供的参数类型。如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法,这个过程叫做“重载解析”。
如果是private方法、static方法、final方法或者是构造器,那么编译器就可以准确的知道应该调用那个方法,我们将这种调用方式为静态绑定,与此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。比如,调用一个f(String)的方法。
当程序运行时,并且采用动态绑定调用方法,虚拟机一定调用与x所引用对象的类型最合适的那个类的方法。假设,x的实际类型是D,他是C的子类,如果子类D中定义了f(String)方法,就直接调用它,否则就搜索C类中的方法,一次类推。
这样调用方法的开销十分的大,因此虚拟机为每个类都定义了一个方法表,其中列举了所有的方法名和签名,这样,真正调用方法时,虚拟机就直接朝朝这个表就可以了。
调用方法的几种方式
一般的,在Java语言中,调用方法有三种方式。
第一种
通过对象名.方法名进行调用,这是最普通的也是最常见的一种调用方式。
第二种
通过new关键字调用构造方法,这种是在实例化对象时使用的方式。
第三种
通过类名.方法名调用,当需要调用的那个方法为静态(有static的)方法时使用。配合实际操作,附如下例子:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。