您好,欢迎访问三七文档
第八讲类的多态本讲主要内容:对象的类型转换抽象类和抽象方法接口的创建和使用一、对象的类型转换向上转型classA{A(){System.out.println(A());}voidf(){System.out.println(A.f());}}classBextendsA{voidf(){System.out.println(B.f());}//voidg(){System.out.println(B.g());}publicstaticvoidmain(String[]aa){Aa=newA();Ab=newB();a.f();b.f();}}父类对象引用可指向子类对象。子类对象引用不可指向父类对象。向上转型过程中,将丢失本类特有的方法和数据。向上转型(续)思考?1.若类B中无f方法,程序的运行结果是?2.若在main方法中,添加语句Bc=newA();,程序可否通过编译?3.若取消注释,添加语句b.g();,可否?向下转型classA{A(){System.out.println(A());}voidf(){System.out.println(A.f());}}classBextendsA{voidf(){System.out.println(B.f());}voidg(){System.out.println(B.g());}publicstaticvoidmain(String[]aa){Aa=newB();Bb=(B)a;a.f();b.f();//a.g();b.g();//分析其合法性}}向下转型(续)向下转型只能针对指向子类对象的基类对象引用进行向下转型语法:(子类名)基类对象引用向下转型后将重新拥有子类特有的方法和数据。二、抽象类和抽象方法抽象类关于抽象类的要点:抽象类是对一系列类的抽象,为一系列类制定一个框架。抽象类提供了操纵一系列的类的通用的界面,而不需要具体实现。抽象类的意义在于继承。抽象类不能生成对象。抽象类(续)如有Circle、Square、Triangle三个类,它们皆含有求周长和面积的方法getL()和getS(),为了进行通用模式的操作,我们可以提取同有成员,抽象成一个Shape类。框架设计如下图:抽象类(续)抽象类的定义[权限修饰]abstractclass类名{…}抽象方法抽象类中的方法可以是抽象的,即只给出方法的原型,而无实现的方法体。方法的实现可在继承抽象类的子类中定义。定义格式:abstract类型方法名(参数);如:abstractvoidab();——对abstractvoidab(){};——错程序实现Shape类:abstractclassShape{abstractdoublegetL();abstractdoublegetS();voidprintSL(){System.out.println(周长:+getL()+\t面积:+getS());}}程序实现(续)Circle类:classCircleextendsShape{doubler;Circle(doublex){r=x;}doublegetL(){return2*Math.PI*r;}doublegetS(){returnMath.PI*r*r;}}程序实现(续)Triange类:classTriangeextendsShape{doublea,b,c;Triange(doublex,doubley,doublez){a=x;b=y;c=z;}doublegetL(){returna+b+c;}doublegetS(){doublel=(a+b+c)/2;returnMath.sqrt((l-a)*(l-b)*(l-c)*l);}}程序实现(续)Square类:classSquareextendsShape{doublea,b;Square(doublex,doubley){a=x;b=y;}doublegetL(){return2*(a+b);}doublegetS(){returna*b;}}程序实现(续)Test类:classTest{publicstaticvoidmain(String[]aa){Shapes=newTriange(3,4,5);s.printSL();s=newSquare(4,6.5);s.printSL();s=newCircle(4.5);s.printSL();}}回顾:多态性是指不同类的对象,对同一个方法调用有不同的响应方式。课题练习练习:按如下要求编程,并分析程序结果。(1)设计一个抽象类Animal,其中包括一个抽象方法sleep()和调用该方法的goSleep方法;(2)设计Animal的子类Bird;(3)设计Animal的子类Fish;(4)设计Animal的子类Person;(5)实例化三种不同的Animal对象,并调用goSleep方法。三、接口的创建和使用接口是什么?接口,interface:是比抽象类更抽象的“类”。接口是行为框架,其中定义了一组行为架框。所有的方法都是抽象的,没有具体实现的细节。实现接口的类需明确实行接口,在类中必须提供这些行为的细则。对接口中的所有方法重写。接口的创建创建方法:interface接口名[extends父接口]{Interfacebody}如显卡接口:interfaceVideoCard{voiddisplay();StringgetName();}说明:(1)接口中所有的方法都默认是publicabstract。不能使用static、final、private、protected等修饰符。(2)其中除了方法,可以设常量(publicstaticfinal的成员变量)。(3)interface前可加权限修饰符,public接口须与程序文件同名。接口的使用接口是为类服务的。接受服务的类定义时要表明实现接口:class类名implements接口名{…}说明:(1)类中需重写接口中所有方法(具体实现),所有重写方法必须由public修饰。(2)类可通过实现接口,间接解决多重继承问题。一个类可以继承另一个类,同时实现一系列接口。接口的使用(续)例:某厂家Dmeng生产VideoCard接口规定的显卡,后主板上插入cpu和显卡,编程模拟其工作过程。VideoCard接口interfaceVideoCard{//显卡接口voiddisplay();StringgetName();}接口的使用(续)Dmeng显卡类//厂商Dmeng实现显卡classDmengimplementsVideoCard{Stringname;Dmeng(){name=Dmeng'svideocard;}publicvoiddisplay(){//重写接口中的方法System.out.println(name+isworking);}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}接口的使用(续)MainBoard主板类classMainBoard{//主板MainBoard使用显卡Stringcpu;VideoCardvc;voidsetCPU(Stringcpu){this.cpu=cpu;}//插入CPUvoidsetVideoCard(VideoCardvc){this.vc=vc;}//插入显卡voidrun(){//主板自检的方法System.out.println(this.cpu);System.out.println(vc.getName());vc.display();System.out.println(Mainbordisworking.);}}接口的使用(续)Test类classTest{publicstaticvoidmain(String[]args){MainBoardmb=newMainBoard();Stringcpu=Intel'sCPU;VideoCardvc=newDmeng();mb.setCPU(cpu);mb.setVideoCard(vc);mb.run();}}接口的使用(续)一个类可以同时实现多个接口接口的使用(续)继承多个接口的类中需要重写每个接口中的所有方法。接口的使用(续)思考?1.接口的英文名是?2.如何定义接口?3.接口中的方法是什么样的?4.接口中可否有方法之外的成员?5.一个类如何来实现接口?6.实现接口的类需要做些什么事情?7.接口与抽象类比较不同在哪里?8.接口有什么用?
本文标题:第8讲 类的多态
链接地址:https://www.777doc.com/doc-3692283 .html