Java调用对象方法的过程是怎么样的?

image.png

编译器查看对象声明类型和方法名

首先想到,一个类中可能存在多个同样方法名字的方法 function(xxx){},同时方法的参数列表的类型不相同。假设 a 声明为 A类的对象,a调用方法 function(){},存在方法 function(int){},function(String)。编译器这时候会一一列举所有A类中名字的 function(xxx){}的方法,同时也会列举上其超类中访问属性为public且名字相同的方法。
这一步,编译器获得所有可能被调用到的方法(不管参数列表)。

重载解析阶段

上一步之后,编译器将会查看调用方法时候,你传入的参数类型,那上面的例子,你写的如果是a.function("String"){},那么是不是就命中了A类中function(String){}方法(参数类型完全匹配啊)。那么前面的这一个命中匹配的过程就叫做重载解析(overloading resolution)

动态绑定&调用

值得注意的是如果调用的方法是private,static,final方法或者构造器,那么编译阶段中编译器就已经知道要调用哪个方法了,这种调用方式是静态绑定(static binding)
那么正常来说,我们调用一个public方法,我们需要依赖的是隐式参数的实际类型。
动态绑定工作原理简述:当有一个方法调用,然后这个方法可能在超类有定义然后子类重写了它,这时候JVM不会立马调用具体了哪个类中的方法,它会等到在运行时候检查对象的实际类型,根据这个类型,查找这个类型的方法表来找到对应的方法来实现。如果子类重写了该方法,则调用子类的实现(实际对象类型对应子类类型);如果没有重写,则按照继承链向上查找,直到找到该方法的一个实现。
方法表:减少每次搜索方法带来的时间消耗。虚拟机预先为每一个类创建一个方法表,其中列出了所有方法的签名和实际调用的方法。这样一来,在真正调用方法的时候,虚拟机仅仅查找这个表就行了。
image.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值