1、多态
1.1 什么是多态
容许将子类类型的指针赋值给父类类型的指针,也可以这么说,同一个行为具有多个不同表现形式或形态的能力叫做多态。
1.2 多态的目的
- 提高程序的复用性,
- 降低程序之间的耦合度
- 提高程序的兼容性和扩展性
1.3 多态的必要条件
继承或接口实现
- 重写
- 父类引用指向子类对象
1.4 多态使用的场景
- 重写: 继承的方法,在子类中重新定义,重新编写
- 接口:接口类型的引用指向其子类对象
- 抽象类和抽象方法:
2 动态绑定(后期绑定)
前面讲了多态的基本概念和使用场景,后面讲讲多态的实现原理,动态绑定
2.1 什么是动态绑定
在运行期,虚拟机判断所引用对象的具体类型,根据实际类型调用其具体方法。
举个例子,假如有一个类名叫Human,其子类为XiaoLI,当虚拟机创建XiaoLI的时候,就会创建对应的方法表,其中包含父类Human的方法表,在向上造型中,比如 Human hu =new XiaoLI; XiaoLi类中有两个方法,一个方法继承自父类Human的方法-doThingking,还有一个是XiaoLI类独有的方法-doWorking,当运行hu.doThinking这条语句时,虚拟机首先会从子类方法表中寻找,没找到才去父类的方法表中寻找。可为什么hu.doWorking会报错呢?这是因为在编译期,编译器通过引用本身的类型在方法表中搜寻对应的方法,没找到就会报错。
百度百科上的讲解为:程序运行过程中,把函数(或过程)调用与响应调用所需要的代码相结合的过程称为动态绑定。
3 静态绑定(前期绑定)
程序在编译器就知道该方法属于哪个类,并将方法和类绑定在一起。
在Java中,final、private、static修饰的方法以及构造函数都是静态绑定的,不需程序运行,不需具体的实例对象就可以知道这个方法的具体内容。
下面这句话,我在其他博客上面看到的,感觉通俗易懂
不需对象的创建就能访问的,就是静态绑定的内容;需要等对象创建出来,使用时根据堆中的实例对象的类型才进行取用的就是动态绑定的内容。