0引言在Java面世以来,它以其简单、易用、面向对象、面向网络、健壮及可移植强等诸多优点,被越来越多地推广和使用。和Java语言的封装性和继承性相比,多态性显得更加重要,而且不易掌握。多态作为面向对象(OO)中的核心机制之一拥有着丰富的内涵。多态性(PolymorPhism)一词来源于拉丁语Poly(表示多的意思)和morphos(意为形态),顾名思义,多态就是一种名称多种形态的意思。从广义上来说所谓多态性是指论域中的某元素有多种解释,具体到面向对象程序设计语言即指对于不同但相似的对象接收到同一消息时会产生不同的行为。它反映了人们在求解问题时,对相似性问题的一种求解方法。1多态的分类Cardelli.LandWegner在“OnUnderstandingTypes,DataAb-straction,andPolymorphism”一文中,将多态分为两大类特定的和通用的4小类:强制的、重载的、参数的和包含的。强制多态和重载多态作为特定的多态,用于刻画语义上无关联的类型间的关系。而参数多态和包含多态作为通用的多态用来系统地刻画语义上相关的一组类型。2Java语言的多态形式研究2.1强制多态强制多态隐式的将参数按某种方法,转换成编译器认为正确的类型以避免错误。例如,在“1.0+1.0”、“1.0+1”及“1.0+”“1”3个表达式中,第1个表达式将两个double的操作数相加;Java中特别声明了这种用法。第2个表达式将double型和int相加。Java中没有明确定义这种运算。不过,编译器隐式的将第二个操作数转换为double型,并作double型的加法。这对程序员来说十分方便,否则将会抛出一个编译错误,或者强制程序员显式的将int转换为double。第3个表达式将double与一个String相加。Java中同样没有定义这样的操作。所以,编译器将double转换成String类型,并将他们做串联。强制多态也会发生在方法调用中。假设类A继承了类B,类C有一个方法,原型为m(B),在下面的代码中,编译器隐式的将A类的对象a1转化为B类的对象。这种隐式的转换使m(B)方法使用所有能转换成B类的所有参数。Cc=newC();Aa1=newA();c.m(a1);并且,隐式的强制转换,可以避免类型转换的麻烦,减少编译错误。当然,编译器仍然会优先验证符合定义的对象类型。2.2重载多态重载(Overload)多态是让类以统一的方式处理不同类型数据的一种手段。Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法。下面是一个方法重载的例子:实例2.2TestOverload.javapublicclassTestOverloadpublicvoidprint(inti)System.out.println(10*i);publicvoidprint(doublej)System.out.println(5*j);publicstaticvoidmain(String][args)TestOverloadt=newTestOverload();t.print(10);t.print(10.0);运行结果:10050.0上例中,对于二个同名方法voidprint(inti)、voidprint(doublei)),编译器根据不同的参数例表,对同名方法的名称做修饰。所以,对于编译器来说,这些同名方法是不同的,二个同名方法的地址在编译期间就已经确定。因此重载多态