多态作为OO几大特性之一,在我们设计模式与实际开发中经常被用到, 在设计模式学习之前,有必要对多态的机制研究总结下。
一、什么是多态(Polymorphism):
这个概念各人各说法,我的理解是:
多态是一个特征,及对象(接口、基类、子类)的多种表现行为。在java中主要体现在以下几点:、
1、重载(overload)与重写(override):
重载:参数多态,即一个类中,相同方法名不同参数(类型、个数)。
重写:子类覆写父类的方法。
2、向上转型(upcast):如:将子类对象赋值给父类对象,由父类对象调用子类的方法。
3、动态绑定(binding) :在程序运行时,根据对象类型调用相应对象的方法。
The fact that an object variable can refer to multiple actual types is called polymorphism. Automatically selecting the appropriate method at run time is called dynamic binding.【摘自Core Java2】
一个对象变量实际上能指向多种类型就是多态。而这个对象变量又能在运行时自动的选择适当的方法来调用就叫动态绑定。
二、OO多态的本质:
多态可以说是OO非常重要的一个机制,可以说没有多态就谈不上是OO。我个人觉得多态的实现机制就是动态绑定(binding),多态的实现思想效果就是达到对象类型和行为实现的隔离。
三、OO多态的实现机制:
多态主要是通过动态绑定(dynamic binding)来实现的。
所谓绑定(binding)就是建立method call(函数调用)和method body(函数体)的关联,动态绑定就是指在程序运行期,判定对象类型并调用相应对象的方法。所以在method call 时必须将对象的类型信息置于对象内,以用来判定对象类型和选择对象。
java里的方法除了使用final修饰的以外,都采用动态绑定机制。
四、OO多态的基本实例:
a、类继承多态
package com.gyb.Polymorphism; /** * @Title: Animal.java * @Package com.gyb.Polymorphism * @Description: 动物基类 * @author gaoyb * @date Dec 22, 2011 11:09:26 AM * @version V1.0 */ public class Animal { public void jump(){ System.out.println("I am jumping !"); } }
package com.gyb.Polymorphism; /** * @Title: Cat.java * @Package com.gyb.Polymorphism * @Description: 动物子类:猫 * @author gaoyb * @date Dec 22, 2011 11:09:26 AM * @version V1.0 */ public class Cat extends Animal { public void jump(){ System.out.println("Cat is jumping !"); } }
package com.gyb.Polymorphism; /** * @Title: Dog.java * @Package com.gyb.Polymorphism * @Description: 动物子类:狗 * @author gaoyb * @date Dec 22, 2011 11:09:26 AM * @version V1.0 */ public class Dog extends Animal{ public void jump(){ System.out.println("Dog is jumping !"); } }
package com.gyb.Polymorphism; public class Test { public static void main(String args[]){ Animal obj1 = new Cat(); Animal obj2 = new Dog(); obj1.jump();//输出结果:Cat is jumping ! obj2.jump();//输出结果:Dog is jumping ! } }
b、接口实现多态
package com.gyb.Polymorphism; public interface C { public void jump(); } class A implements C { public void jump(){ System.out.println("A is jumping!"); } } class B implements C { public void jump(){ System.out.println("B is jumping!"); } }
package com.gyb.Polymorphism; public class Test { public static void main(String args[]){ C oa = new A(); C ob = new B(); oa.jump();//输出结果:A is jumping ! ob.jump();//输出结果:B is jumping ! } }