1.1 什么是多态?
多态是继数据抽象和继承之后的第三种基本特征。
定义:多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
面向对象特性:“封装”通过合并特征和行为来创建新的数据类型。而“多态”的作用则是消除类型之间的耦合关系。
“继承”允许将对象视为它自己本身的类型或其基本类型来加以处理,它允许将多种类型(从同一基类导出 )视为同一类型来处理。
而“多态”方法调用允许一种类型表现出与其他相似类型之间的区别,只要他们都是从同一类型导出的。
△△△ 我现在这么认为,多态和继承说的是一个事情,都是说的是类与类之间的关系。
我的理解是 继承表现的是具有相同成员的基类和导出类的关系。
而多态表示的是在调用相同类型的时候,表现出来的调用哪个方法的问题。
1.2 多态是如何实现的呢?
答:通过动态绑定。
什么是绑定? 抽象来讲,将一个方法调用同一个方法主体关联起来被称作绑定。
若在程序执行前进行绑定,则称为前期绑定。
而当我们的方法需要一个基类类型的时候,却传入了一个子类对象,而编译器能在运行时
动态的判断出子类的类型,这种机制就是动态绑定,也叫运行时绑定或者后期绑定。
想一下就能知道,这是通过在对象中加入了“类型信息”实现的。
△△△ 注意:java中除了static 和 final方法之外,其他的方法都是动态绑定的。
当我们为一个方法定义为final的时候,除了可以防止其他人覆盖该方法,还有就是告诉编译器,这个方法不需要动态绑定,编译器就可以为final方法的调用生成更为有效的方法。
我们知道了所有方法都是通过动态绑定来实现多态这个事实之后,我们就可以大胆编写只和基类打交道的程序代码了。
1.3 多态实现可扩展
package polymorphism.music;
public class Music {
public static void tune(Instrument i) {
// ...
i.play(Note.MIDDLE_C);
}
public static void main(String[] args) {
Wind flute = new Wind();
tune(flute); // Upcasting
}
}
比如在这个类当中,我们的方法tune()只和基类Instrument打交道,当我们需要新的乐器的时候,不需要改变原来的tune()。只需要创建新乐器类型就好了。在一个设计良好的OOP程序中,大多数或者所有的方法都会遵循tune()模型,而且只与基类接口通信,这就实现了可扩展性。
也就是说,我们所修改的代码,不会对程序中其他不应收到影响的部分产生破坏。
换句话说,多态是让程序员”将改变的事物与未改变的事物分离“的重要技术。
著作权归@kfh所有转载请注明出处