Java的多态性,抽象类与接口

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

面向对象设计与编程(SW2007)1第6讲Java多态性、抽象类与接口掌握多态的优势和应用场合实现多态引用转型多态性程序实例分析掌握instanceof运算符的使用抽象类与抽象方法接口与接口的应用面向对象设计与编程(SW2007)继承是指从一个父类(父类)派生出派生类(子类)的过程;继承使用关键字extends;对于类成员,可以使用public、protected、缺省和private这4种访问权限修饰符;对于类,可以使用public和缺省这2个访问权限;创建子类实例时,必须先执行父类的构造方法,然后再执行子类的构造方法;super关键字有两种主要用途,都与父类有关。回顾面向对象设计与编程(SW2007)为什么使用多态?宠物生病了,需要主人给宠物看病不同宠物看病过程不一样不同宠物恢复后体力值不一样打针吃药吃药疗养狗狗Q仔面向对象设计与编程(SW2007)为什么使用多态?编码实现publicclassMaster{publicvoidCure(Dogdog){if(dog.getHealth()50){dog.setHealth(60);System.out.println(打针、吃药);}}publicvoidCure(Penguinpenguin){if(penguin.getHealth()50)penguin.setHealth(70);System.out.println(吃药、疗养);}}主人类……Mastermaster=newMaster();master.Cure(dog);master.Cure(penguin);……测试方法面向对象设计与编程(SW2007)为什么使用多态?如果又需要给XXX看病,怎么办?添加XXX类,继承Pet类修改Master类,添加给XXX看病的方法使用多态优化设计频繁修改代码,代码可扩展性、可维护性差面向对象设计与编程(SW2007)为什么使用多态?使用多态优化后的代码……Petpet=newDog();Mastermaster=newMaster();master.Cure(pet);……测试方法publicclassDogextendsPet{publicvoidtoHospital(){this.setHealth(60);System.out.println(打针、吃药);}}publicclassPenguinextendsPet{publicvoidtoHospital(){this.setHealth(70);System.out.println(吃药、疗养);}}publicclassMaster{publicvoidCure(Petpet){if(pet.getHealth()50)pet.toHospital();}}主人类Dog类Penguin类1234又要给XXX看病时,只需:1.编写XXX类继承Pet类(旧方案也需要)2.创建XXX类对象(旧方案也需要)3.其他代码不变(不用修改Master类)面向对象设计与编程(SW2007)什么是多态?生活中的多态你能列举出一个多态的生活示例吗?程序中的多态同一个引用类型,使用不同的实例而执行不同操作父类引用,子类对象同一种事物,由于条件不同,产生的结果也不同面向对象设计与编程(SW2007)8多态性(polymorphism)概念:是面向对象程序设计的另一个重要特征,其基本含义是“拥有多种形态”,具体指在程序中用相同的名称来表示不同的含义。例如:用同一方法名来表示不同的操作。类型:有两种静态多态性:包括变量的隐藏、方法的重载动态多态性:在编译时不能确定调用方法,只有在运行时才能确定调用方法,又称为运行时的多态性。面向对象设计与编程(SW2007)静态多态静态多态也称为编译时多态,即在编译时决定调用哪个方法;静态多态一般是指方法重载;只要构成了方法重载,就可以认为形成了静态多态的条件;静态多态与是否发生继承没有必然联系。面向对象设计与编程(SW2007)动态多态动态多态也称为运行时多态,即在运行时才能确定调用哪个方法;形成动态多态必须具体以下条件:必须要有继承的情况存在;在继承中必须要有方法覆盖;必须由父类的引用指向派生类的实例,并且通过父类的引用调用被覆盖的方法;由上述条件可以看出,继承是实现动态多态的首要前提。面向对象设计与编程(SW2007)11下面主要介绍动态多态性//多态性的例子classAnimal{publicvoidroar(){System.out.println(动物:...);}}classCatextendsAnimal{publicvoidroar(){System.out.println(猫:喵,喵,喵,...);}}classDogextendsAnimal{publicvoidroar(){System.out.println(狗:汪,汪,汪,...);}}面向对象设计与编程(SW2007)12//多态性的例子(续)publicclassAnimalTest{publicstaticvoidmain(Stringargs[]){Animalam=newAnimal();am.roar();am=newDog();am.roar();am=newCat();am.roar();}}程序运行结果:动物:...狗:汪,汪,汪,...猫:喵,喵,喵,...根据对象的赋值规则,可以把子类对象赋给父类对象名,这是允许。当用同一形式:父类对象名.roar()去调用时,能够根据子类对象的不同,得到不同的结果,这就是多态性。面向对象设计与编程(SW2007)实现多态的流程用多态实现打印机分为黑白打印机和彩色打印机不同类型的打印机打印效果不同黑白打印机彩色打印机打印面向对象设计与编程(SW2007)实现多态的设计思路使用多态实现思路编写父类编写子类,子类重写(覆盖)父类方法运行时,使用父类的类型,子类的对象计算机可以连接各种打印机无论连接何种打印机打印方法都相同根据连接打印机不同,效果也不同面向对象设计与编程(SW2007)实现多态编码实现实现多态的两个要素:1.方法重写2.使用父类类型classPrinter{print(Stringstr);}classColorPrinterextendsPrinter{print(Stringstr){System.out.println(输出彩色的+str);}}classBlackPrinterextendsPrinter{print(Stringstr){System.out.println(输出黑白的+str);}}publicstaticvoidmain(String[]args){Printerp=newColorPrinter();p.print();p=newBlackPrinter();p.print();}父类子类运行同一种操作方式,不同的操作对象只能调用父类已经定义的方法继承是子类使用父类的方法,而多态则是父类使用子类的方法。(把父类当做子类来用)面向对象设计与编程(SW2007)方法重写(覆盖)方法重写的规则在继承关系的子类中重写的方法名、参数、返回值类型必须与父类相同私有方法不能继承因而也无法重写位置方法名参数表返回值访问修饰符方法重写子类相同相同相同不能比父类更严格方法重载同类相同不相同无关无关方法重写override方法重载overloadVS面向对象设计与编程(SW2007)17实现运行时多态技术的条件:有一个继承层次关系;在子类中重写父类的方法;通过父类的引用对子类对象进行调用。采用多态技术的优点:引进多态技术之后,尽管子类的对象千差万别,但都可以采用父类引用.方法名([参数])统一方式来调用,在程序运行时能根据子对象的不同得到不同的结果。这种“以不变应万变”的形式可以规范、简化程序设计,符合软件工程的“一个接口,多种方法”思想。面向对象设计与编程(SW2007)多态的运行机制多态的运行机制Java多态机制是基于“方法绑定(binding)”,就是建立methodcall(方法调用)和methodbody(方法本体)的关联。如果绑定动作发生于程序执行前(由编译器和连接器完成),称为“先期绑定”。对于面向过程的语言它们没有其他选择,一定是先期绑定。比如C编译器只有一种methodcall,就是先期绑定。(C++有先期联编和后期联编)当有多态的情况时,解决方案便是所谓的后期绑定(latebinding):绑定动作将在执行期才根据对象型别而进行。后期绑定也被称为执行期绑定(run-timebinding)或动态绑定(dynamicbinding)。Java的所有方法,除了被声明为final者,都使用后期绑定。将方法声明为final型可以有效防止他人覆写该函数。但是或许更重要的是,这么做可以“关闭”动态绑定。或者说,这么做便是告诉编译器:动态绑定是不需要的。于是编译器可以产生效率较佳的程序代码。面向对象设计与编程(SW2007)引用转型父类的引用可以指向子类的对象,如:BaseClassobj=newDerivedClass();这样的语句是合法的;但是子类的引用则不可以指向父类的对象,如:DerivedClassobj=newBaseClass();这样的语句将引发错误。面向对象设计与编程(SW2007)引用转型示例classPerson{//定义人类……}classStudentextendsPerson{//学生类继承于人类……}publicclassOverriddenDemo{publicstaticvoidmain(String[]args){//正确,所有的学生一定是人Personper=newStudent();//错误,并不是所有的人都是学生Studentstd=newPerson();}}面向对象设计与编程(SW2007)多态性实例分析Example例如动物园的饲养员能够给各种各样的动物喂食。图1显示了饲养员Feeder、食物Food和动物Animal以及它的子类的类框图。面向对象设计与编程(SW2007)多态性实例分析图1饲养员Feeder、食物Food和动物Animal以及它的子类的类框图面向对象设计与编程(SW2007)多态性实例分析可以把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();feeder.feed(animal,food);//给狗喂肉骨头//给猫喂鱼面向对象设计与编程(SW2007)多态性实例分析Java语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换:Animalanimal=newDog();Dogdog=(Dog)animal;Creaturecreature=animal;如图2所示,如果把引用变量转换为子类类型,称为向下转型,如果把引用变量转换为父类类型,称为向上转型。在进行引用变量的类型转换时,会受到各种限制。而且在通过引用变量访问它所引用的实例的静态属性、静态方法、实例属性、实例方法,以及从父类中继承的方法和属性时,Java虚拟机会采用不同的绑定机制。//向下转型,把Animal类型转换为Dog类型//向上转型,把Animal类型转换为Creature类型面向对象设计与编程(SW2007)多态图2类型转换面向对象设计与编程(

1 / 68
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功