java中方法调用

java方法调用的过程主要分为2个阶段:(假设要调用x.f(args),隐式参数x是对象C的一个对象):

1.编译器首先查看对象的声明类型和方法名。

    编译器在编译时首先会一一列举出所有 C类中名为f的方法其父类中访问属性为public且名为f的方法
    到这,编译器已经获得了所有可能被调用的候选方法。

2.然后编译器会查看调用方法时提供的参数类型

    因为f方法可能有多个同名的方法,编译器查看它们的参数类型。如果在所用名为f的方法中存在一个完全匹配,就选择这个方法,这个过程叫 "重载解析"
    到这,编译器已经获得了需要调用的方法名字和参数类型。这基本上就可以确定调用的方法了。


    另外在方法调用中我们不能不了解 静态绑定动态绑定。静态绑定是指编译器可以准确的知道应该调用哪个方法,(也就是说该方法是可以唯一确定的);动态绑定是指调用的方法依赖于隐式参数的实际类型,并且在运行时才实现。(也就是说必须知道方法调用者的实际类型才能确定调用了哪个方法)。
    像private方法,static方法,final方法或是构造器方法都是可以唯一确定的,调用这些方法的方式就是静态绑定。
    当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型最合适的那个类的方法。如:假设x的实际类型是D,D是C类的子类。如果D类也定义了一个f方法,就直接调用这个方法,若D没有这个方法,就调用其父类的方法。
    动态绑定每次调用方法时都要进行搜索,时间开销非常大。因此,虚拟机会预先为每一个类创建一个 *方法表*,其中列出了所有方法的签名和实际调用的方法。这样,调用方法时,虚拟机只要遍历这张方法表就行了。表中内容大致如下:
类Empoyee:
	getName() -> Employee.getName()
	getSalary() -> Employee.getSalary()
	......
类Manager:
	getName() -> Manager.getName()
	getSalary() -> Employee.getSalary()
	......

在运行时,调用e.getName(),虚拟机提取e的实际类型,假设实际类型是Employee;接下来虚拟机搜索方法表,找到签名为getName()的方法,最后调用即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值