Java语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
说到面向对象编程,那就不得不提面向对象编程的三大特性:继承、封装和多态。那下面我们先来说一说封装。
封装隐藏了类的内部实现机制,可以在不想影响使用的情况下改变类的内部结构,同时也保护了数据。对外界也可以隐藏内部的细节,只暴露给外界访问的方法。
继承可以复用父类的代码。两个类之间若存在is-a的关系,就可以使用继承,从而达到代码的复用,同时也给多态的实现做了铺垫。
下面我们只要说说面向对象编程中的多态。所谓的多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序的运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能确定,这就是所谓的动态绑定(dynamic binding)。
既然多态那么重要,那么多态到底有什么好处呢?
- 可替换性
- 消除类型之间的耦合关系
- 可扩充性
- 接口性
- 灵活性
- 简化性
Java实现多态有三个必要的条件:继承、重写、向上转型
- 继承:在多态中必须存在有继承关系的子类和父类。
- 重写:子类对父类中某些方法进行重写定义,在调用这些方法时就会调用子类的方法。
- 向上转型:在多态中需要将父类的引用指向子类,只有这样该引用才能够具备调用父类和子类的方法。
多态的实现方式
1. 继承重写
1 | public abstract class Animal { |
所以基于继承实现的多态可以总结如下:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。
如果父类是抽象类,那么子类必须要实现父类中所有的抽象方法,这样该父类所有的子类一定存在统一的对外接口,但其内部的具体实现可以各异。这样我们就可以使用顶层类提供的统一接口来处理该层次的方法。
2.基于接口实现多态
继承是通过重写父类的同一方法的几个不同子类来体现的,那么就可就是通过实现接口并覆盖接口中同一方法的几不同的类体现的。
在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。
继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。