理解java静态绑定和动态绑定

理解java的动态绑定静态绑定之前需要了解继承多态的一些相关概念。

继承

基于已存在的类构造新的类。通过继承获取父类的属性和方法,实现复用。在此基础上可以增加新的属性和方法满足新的需求。
继承是典型的"is-a"关系,即可以说子类的对象是父类的对象,反之则不行。且可以用"置换法则"表述这种关系。

多态

java中对象变量是多态的,一个引用父类对象的变量也可以引用其派生的任何子类对象。(运行时JVM可以获取其实际类型,进而保证可以正确的调用方法)。

一个对象变量可以指示多种实际类型的现象称之为多态

这里也引出了动态绑定的概念

运行时能够自动地选择调用哪个方法的现象称之为动态绑定

java中默认的处理方式就是动态绑定。这里我们先将动态绑定的概念放一放,继续了解方法调用的流程,通过这个流程引出静态绑定的概念。

方法的调用过程

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

由之前多态的概念我们可以知道这里对象的声明类型可以是子类也可以是其父类,编译器此时并不知道其实际引用类型是子类还是父类,只查看其声明类型。
然后根据方法名获取当前类所有同名方法及其父类所有同名共有方法。
此时编译器获取到了所有可能匹配的方法集合。

  1. 编译器查看调用时的参数类型

根据这个参数类型,寻找方法集合中匹配的方法。这个过程称之为重载解析
在解析过程中,如果没找到匹配的相应参数类型方法,或尝试匹配参数类型转换后的方法,若找到多个匹配的方法则会报错。
此时编译器获取到了需要调用的方法名和参数类型。

  1. 对private、static、final、构造器,执行静态绑定

至于为什么会对这四种方法类型做静态绑定处理,下面一一分析

①private: 类的私有方法,其可见性只针对当前类,不可被继承。所以编译器清楚的知道具体该调用的方法在哪。
②static:静态方法,也称为类方法,直接与类绑定,同样不可被继承。所以编译器此时也知道具体调用的方法位置。
③final:final修饰的方法可以被继承,但是不能被子类重写(override),也杜绝了去其继承关系中的其他类寻找的必要性。
④构造器:不能被继承,只能通过super关键字通知编译器去调用父类的构造器。

至此,编译器完成方法调用的静态绑定工作。至于调用过程中依赖于隐式对象this实际类型的方法,则交由jvm采用动态绑定完成。

  1. JVM在方法列表中寻找 与采取动态绑定调用方法最匹配的方法完成绑定。

由于jvm可以获取调用方法对象变量引用的实际类型,所以可以匹配与之最合适的方法,如果在子类方法列表中发现合适方法,直接调用,否则去其父类方法列表中寻找,并以此类推。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值