欢迎来到天天文库
浏览记录
ID:56527612
大小:100.00 KB
页数:17页
时间:2020-06-27
《JAVA特性【多态】详解.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、多态(polymorphism)多态的运行机制所谓“绑定(binding)”,就是建立methodcall(函数调用)和methodbody(函数本体)的关联。如果绑定动作发生于程序执行前(由编译器和连接器完成),称为“先期绑定”。对于面向过程的语言它们没有其他选择,一定是先期绑定。比如C编译器只有一种methodcall,就是先期绑定。(C++有先期联编和后期联编)当有多态的情况时,解决方法便是所谓的后期绑定(latebinding):绑定动作将在执行期才根据对象型别而进行。后期绑定也被称为执行期绑定(run-timebinding)或动态绑定(dynamicbin
2、ding)。Java的所有函数,除了被声明为final者,都使用后期绑定。从表面上来理解,将函数声明为final型这样是为了防止他人覆写该函数。但是或许更重要的是,这么做可以“关闭”动态绑定。或者说,这么做便是告诉编译器:动态绑定是不需要的。于是编译器可以产生效率较佳的程序代码。这样说来,动态绑定(后期绑定)的效率不如先期绑定了。多态(polymorphism)Example例如动物园的饲养员能够给各种各样的动物喂食。图1显示了饲养员Feeder、食物Food和动物Animal以及它的子类的类框图。多态图1饲养员Feeder、食物Food和动物Animal以及它的子类
3、的类框图多态可以把Feeder、Animal和Food都看成独立的子系统。Feeder类的定义如下:publicclassFeeder{publicvoidfeed(Animalanimal,Foodfood){animal.eat(food);}}以下程序演示一个饲养员分别给一只狗喂肉骨头,给一只猫喂鱼。Feederfeeder=newFeeder();Animalanimal=newDog();Foodfood=newBone();feeder.feed(animal,food);animal=newCat();food=newFish();fe
4、eder.feed(animal,food);//给狗喂肉骨头//给猫喂鱼多态Java语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换:Animalanimal=newDog();Dogdog=(Dog)animal;Creaturecreature=animal;如图2所示,如果把引用变量转换为子类类型,称为向下转型,如果把引用变量转换为父类类型,称为向上转型。在进行引用变量的类型转换时,会受到各种限制。而且在通过引用变量访问它所引用的实例的静态属性、静态方法、实例属性、实例方法,以及从父类中继承的方法和属性时,Java虚拟机会采用不同
5、的绑定机制。//向下转型,把Animal类型转换为Dog类型//向上转型,把Animal类型转换为Creature类型多态图2类型转换多态下面通过具体的例子来演示多态的各种特性。在下面的例程中,Base父类和Sub子类中都定义了实例变量var、实例方法method()、静态变量staticVar和静态方法staticMethod(),此外,在Sub类中还定义了实例变量subVar和subMethod()。Sub.javapackagepoly;classBase{Stringvar="BaseVar";staticStringstaticVar="StaticB
6、aseVar";voidmethod(){System.out.println("Basemethod");}staticvoidstaticMethod(){System.out.println("StaticBasemethod");}}//实例变量//静态变量//实例方法//静态方法多态publicclassSubextendsBase{Stringvar="SubVar";//实例变量staticStringstaticVar="StaticSubVar";//静态变量voidmethod(){//覆盖父类的method()方法System.out.
7、println("Submethod");}staticvoidstaticMethod(){//隐藏父类的staticMethod()方法System.out.println("StaticSubmethod");}StringsubVar="VaronlybelongingtoSub";voidsubMethod(){System.out.println("MethodonlybelongingtoSub");}publicstaticvoidmain(Stringargs[]){Basewho=newSub();//who被声明
此文档下载收益归作者所有