记得在学校学习Java和C#的时候,老师都跟我们讲到了多态,多态是面向对象的一个重要的特征。其实其定义也什么简单:某一类事物的多种存在形态。
多态体现在父类或者接口的引用指向或者接收自己的子类对象。例如:
class FClass{}
class Subclass1 extends FClass{}
class Subclass2 extends FClass{}
FClass c1 = new Subclass1 ( );
FClass c2 = new Subclass2 ( );
这样一来,c1,c2虽然都是FClass,但是由于引用的子类对象不同,那么他们的形态也就不同了。
多态的作用在于,多态的存在提高了程序的扩展性和后期可维护性。但是她存在的前提是需要存在继承或者实现关系,也就是父类引用对象。她有好处也有弊端,好处是大大提高了程序的扩展性,弊端是,虽然提高了扩展性,但是只能是使用父类引用访问父类中的成员。也就是说要有覆盖操作,多种形态的产生实际上就是由于各个子类对父类的方法进行了覆盖。这样一来含有多种形态的父类对象不能去调用各个子类中的特有方法,那万一有调用特定的方法的需求,我们该如何让这个多种形态的实例有调用的权限呢?那么我们就要涉及转型了。当我们这样操作:FClass c1 = new Subclass1 ( );我们将其类型提升了,我们称其向上转型。如果要强调子类特有的方法,我们可以强制将父类的引用转成子类类型,我们在使用子类中的具体方法时就不要再定义一个具体的子类对象了,这样会很多余。我们称其为向下转型。但是我们这样做就可以了:
FClass c1 = new Subclass1 ( );
SubClass s = ( SubClass )c1;
这样我们把父类的多态对象强制转换为子类对象了,从而去调用子类的方法。
假如父类可以创建对象,但是我们不能这样做:
FClass c1 = new FClass ( );
Cat c = (Cat)a;
这样是坚决不允许的。多态的过程中始终是子类在做不同的形态变化。在这里,我们可以发现,对于这样一个具有多态类型的父类对象,我们们并不知道她的实质的子类对象是什么。因此Java提供了一个方法来返回对象的类型:instanceof,其用法是:对象 intanceof 类型(类类型 接口类型)。
接下来我们来总结下多态中成员函数的特点:在编译时期,她是参阅引用性变量所述的类中是否有调用的方法,如果有,则编译通过,反之,如果没有,就会编译失败。在运行时期,她参阅的是对象所属类中是否有调用的方法,因此就涉及转型的问题了。在多态中,成员变量在编译和运行时,都是参考引用性所属类中是否有该成员变量。另外对于静态成员函数,无论在那个时期,都市参考引用性所属类中是否有调用的方法。
最后,我们提一下Object类,他是所有类的直接或者间接父类,因此该类中定义的肯定是所有对象都具备的功能。例如:Object类中已经提供了对对象是否相同的比较方法。如果自定义的类中也有了相同的功能,就没有必要重新定义,只要沿袭父类中的功能,建立自己的比较内容就可以了,这就是我们以前所述的覆盖。