第5章 抽象类,接口和内部类_第1页
第5章 抽象类,接口和内部类_第2页
第5章 抽象类,接口和内部类_第3页
第5章 抽象类,接口和内部类_第4页
第5章 抽象类,接口和内部类_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,1,第5章面向对象(下),.,2,主要内容,5.1抽象类5.2接口5.3内部类,.,3,5.1抽象类,用abstract修饰的类称为抽象类,用abstract修饰的成员方法称为抽象方法。对于抽象方法,在抽象类中只指定方法名及类型,而不写实现代码。,.,4,5.1抽象类的定义,publicabstractclass类名extends父类名列表/数据成员声明/抽象方法声明publicabstract返回值方法名(参数列表)throw异常列表,.,5,abstractclassShapesprotectedintx,y,k;protecteddoublem;publicabstractdoublegetArea();publicabstractdoublegetPerimeter();,.,6,抽象类中可以有零个或多个抽象方法,也可以包含非抽象方法。只要有一个抽象方法,类前就必须有abstract修饰。若没有抽象方法,类前也可有abstract修饰。抽象类不能创建对象,创建对象必须由具体子类来实现,但可以有声明,声明能引用所有具体子类的对象。,.,7,抽象类必定要派生子类,若派生的子类是具体类,则具体子类中必须实现抽象类中定义的所有抽象方法(覆盖);若子类还是抽象类,父类中已有的abstract方法,则子类中就不能再有。,.,8,在抽象类中,非抽象方法可以调用抽象方法。abstract不能与final并列修饰同一个类;abstract不能与private,static,final或native并列修饰同一个方法;abstract类中不能有private成员,.,9,abstractclassCarpublicabstractvoidstartUp();abstractclassMazdaextendsCarpublicabstractvoidturbo();publicclassMazda6extendsMazdapublicvoidstartUp()/实现startUp方法System.out.println(调用了Mazda6的启动功能!);publicvoidturbo()/实现turbo方法System.out.println(调用了Mazda6的加速功能!);publicclassMazda3extendsMazdapublicvoidstartUp()/实现startUp方法System.out.println(调用了Mazda3的启动功能!);publicvoidturbo()/实现turbo方法System.out.println(调用了Mazda3的加速功能!);publicclassSample4_17publicstaticvoidmain(Stringargs)Mazda6a6=newMazda6();a6.startUp();a6.turbo();Mazda3a8=newMazda3();a8.startUp();a8.turbo();,.,10,abstractclassShapesprotectedintx,y,k;protecteddoublem;publicShapes(intx,inty,intk,doublem)this.x=x;this.y=y;this.k=k;this.m=m;abstractpublicdoublegetArea();abstractpublicdoublegetPerimeter();classRectextendsShapespublicRect(intx,inty,intwidth,intheight)super(x,y,width,height);publicdoublegetArea()return(k*m);publicdoublegetPerimeter()return(2*k+2*m);classTriangleextendsShapespublicTriangle(intbaseA,intbaseB,intbaseC)super(baseA,baseB,baseC,0);/m充当了周长的一半m=(baseA+baseB+baseC)/2.0;publicdoublegetArea()return(Math.sqrt(m*(m-k)*(m-x)*(m-y);publicdoublegetPerimeter()return(k+x+y);,publicclassRunShapestaticvoidprint(Shapess)System.out.println(s.getClass().getName();System.out.println(s.getArea();System.out.println(s.getPerimeter();publicstaticvoidmain(Stringargs)Shapesrect=newRect(5,15,25,25);print(rect);Shapestri=newTriangle(5,5,8);print(tri);,.,11,5.1.2抽象类设计注意事项,抽取同类对象的共同行为包含对象的本质尽可能简单,.,12,5.2接口,接口是功能方法说明的集合。接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。,.,13,接口的角色,接口扮演将实现者和使用者有机联系到一起的角色。,.,14,publicinterface接口名extends父接口名列表/静态常量数据成员声明publicstaticfinal域类型域名=常量值;/抽象方法声明publicabstract返回值方法名(参数列表)throw异常列表;,.,15,5.2.1接口的特性,接口中所有方法自动属于abstractintcompareTo(Objectother);接口中不能包含静态方法publicinterfaceComparablestaticintcompareTo(Objectother);,.,16,接口中只能定义静态常量,不能含有实例域publicinterfaceCaculatorstaticfinaldoublePI=3.1415926;staticfinaldoubleE=2.71828183;doublesum;/接口中的域自动设为staticfinal,.,17,不能在接口中实现方法publicinterfaceComparableintcompareTo(Objectother);,publicinterfaceCaculatorObjectadd(Objectother);,.,18,接口具有继承性,可通过extends关键字声明接口的父接口。publicinterfaceMoveablevoidmove(doublex,doubley);publicinterfacePoweredextendsMoveabledoublemilesPerGallon();,.,19,接口的实现和使用将类声明为实现给定的接口classEmployeeimplementsComparable对接口中的所有方法进行定义publicintcompareTo(ObjectotherObject)Employeeother=(Employee)otherObject;if(salaryother.salary)return1;return0;,.,20,interfaceWasherabstractvoidstartUp();/启动abstractvoidletWaterIn();/进水abstractvoidwashClothes();/洗衣abstractvoidletWaterOut();/排水abstractvoidstop();/停止classRoseBrandimplementsWasherpublicvoidstartUp()System.out.println(startUp);publicvoidletWaterIn()System.out.println(letWaterIn);publicvoidwashClothes()System.out.println(washClothes);publicvoidletWaterOut()System.out.println(letWaterOut);publicvoidstop()System.out.println(stop);/脱水/publicvoiddehydrate()System.out.println(dehydrate);publicclassConsumerpublicstaticvoidmain(Stringargs)/接口声明引用实现接口的RoseBrand类的对象。Washerw=newRoseBrand();w.startUp();w.letWaterIn();w.washClothes();w.letWaterOut();w.stop();/w.dehydrate();当通过接口调用玫瑰洗衣机类独有的,/接口未定义的功能方法,编译会报错。,.,21,接口实现要注意几点一个类可以实现多个接口classEmployeeimplementsCloneable,Comparable接口的实现者可以继承接口中定义的常量实现接口的类可以是抽象类,可以不实现该接口的所有方法类在实现接口方法时,必须显式使用public修饰符,否则将被警告为缩小了接口中定义的方法的访问控制范围,.,22,接口不能使用new运算符实例化一个接口x=newComparable(.);/ERROR可以声明接口的变量,接口变量必须引用实现了该接口的类的对象Comparablex;x=newEmployee(.);,.,23,/飞行器接口publicinterfaceAerocraftpublicvoidfly();publicinterfaceAirPlane/载客飞行publicvoidpassenger();/直升机接口publicinterfaceHelicopter/垂直飞行publicvoidverticaStart();/阿帕奇直升机类,同时实现Aerocraft和Helicopter接口publicclassApacheimplementsAerocraft,Helicopterpublicvoidfly()/实现Aerocraft中的fly方法System.out.println(飞行器可飞行);publicvoidverticaStart()/实现Helicopter中的verticaStart方法System.out.println(直升飞机可以垂直起飞);,/A380客机机类,同时实现Aerocraft和AirPlaner接口publicclassA380implementsAerocraft,AirPlanepublicvoidfly()/实现Aerocraft中的fly方法System.out.println(飞行器可飞行);/实现AirPlaner中的passengert方法publicvoidpassenger()System.out.println(A380可以载客625人飞行);,publicclassSample5_1publicstaticvoidmain(Stringargs)/创建阿帕奇直升飞机对象Apachea=newApache();a.fly();a.verticaStart();/创建A380对象A380a1=newA380();a1.fly();a1.passenger();,.,24,5.2.2接口与抽象类,abstractclassComparablepublicabstractintcompareTo(Objectother);classEmployeeextendsComparablepublicintcompareTo(Objectother).每个类只能继承一个类,但可以实现多个接口,.,25,.,26,publicinterfaceFlyer/飞行器都可以飞行,fly为飞行方法。所以继承Flyer接口的类都必须实现改方法publicvoidfly();publicabstractclassVehiclepublicabstractvoidconsume();publicabstractclassAnimalpublicabstractvoideat();publicclassAirPlaneextendsVehicleimplementsFlyer/实现抽象方法publicvoidconsume()System.out.println(消耗汽油的飞行器!);publicvoidfly()System.out.println(我是飞机!);publicclassBridextendsAnimalimplementsFlyer/实现继承的抽象方法publicvoideat()System.out.println(鸟需要吃东西!);publicvoidfly()System.out.println(我是一只鸟!);,publicclassSample5_2publicstaticvoidmain(Stringargs)/创建鸟类对象Bridb=newBrid();/创建飞机对象AirPlaneair=newAirPlane();/飞机执行的动作System.out.println(*飞机执行的动作*);air.fly();air.consume();/鸟执行的动作System.out.println(*鸟执行的动作*);b.fly();b.eat();,.,27,5.5内部类,内部类是定义在另一个类中的类。内部类作为外部类的一个成员,依附于外部类而存在。内部类可为静态,可用protected和private修饰(而外部类只能使用public和protected的包访问权限)。内部类主要有以下几类:局部内部类、成员内部类、静态内部类、匿名内部类。为什么需要使用内部类?内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据内部类可以对同一个包中的其他类隐藏起来每个内部类都能独立地继承一个类或多个接口,内部类有效地实现了”多重继承”。,.,28,5.5.1局部内部类,定义在方法中的内部类称为局部类定义形式:voidf()classInner.,.,29,与方法的局部变量类似,局部类不能用public或private修饰局部类的作用域被限定在声明这个局部类的块中局部类可以对外部世界完全隐藏,除了f()方法外,其他代码方法都不能访问局部类,.,30,局部类可以访问外部类的所有属性和方法,包括private属性局部类只能引用方法体内的常量,不能访问方法体内的局部变量,.,31,publicclassOuterstaticinta=10;intb=20;voidf()finalintc=30;doubled=2;/局部变量Inner类不能引用classInnerpublicInner()b=100;System.out.println(a+b+c);Innerin=newInner();publicstaticvoidmain(Stringargs)Outerouter=newOuter();outer.f();,.,32,5.5.2成员内部类,定义在外部类中,作为外部类的一个成员存在,与外部类的属性、方法并列定义形式:classOuterclassInner.,.,33,成员类可以引用外部类的所有成员,包括被private修饰的classOuterprivateinta=10;voidf()classInnerintd;publicInner()d=a;f();,.,34,外部类与成员类定义的成员重名时,利用关键字this引用成员,.,35,classOuterinta;classInnerinta=20;voidf()inta=10;System.out.println(a);System.out.println(this.a);System.out.println(Outer.this.a);,.,36,成员类的成员不能被static修饰,但允许静态常量存在classOuterclassInnerinta;/可以voidf()/可以staticfinalintb=10;/可以staticintc;/错误staticvoidg()./错误,.,37,在外部类之内创建内部类对象,publicclassOutter/定义内部类publicclassInnerpublicvoidshow()/打印输出System.out.println(调用了内部类中的show方法);publicvoidoutterMethod()/外部类中的方法,调用内部类Inneri=newInner();/在外部类中创建内部类的对象i.show();/调用内部类中的方法publicclassSample5_4publicstaticvoidmain(Stringargs)Outtero=newOutter();/创建外部类的对象o.outterMethod();/调用外部类中创建内部类对象的方法,.,38,在外部类之外创建内部类对象,只有创建了外部类对象之后,才能创建内部类对象,才能使用内部类的成员Outerout=newOuter();Outer.Innerin=out.newInner();,.,39,publicclassOutter/定义内部类publicclassInner/定义内部类方法show,用来打印输出publicvoidshow()/打印输出System.out.println(调用了内部类中的show方法);publicclassSample5_5publicstaticvoidmain(Stringargs)/创建外部类的对象Outterout=newOutter();/创建内部类的对象Outter.Inneri=out.newInner();/调用内部类中的方法i.show();,.,40,5.5.3匿名内部类,没有取名的内部类就是匿名类定义形式:classAclassAAAa=newA()/定义类且创建对象;此时产生的对象是类A的子类对象,.,41,publicclassOutterpublicvoidshow()/打印输出System.out.println(这里是Outter类的方法);publicclassSample5_8publicstaticvoidmain(Stringargs)Outterout=newOutter()/定义匿名内部类并创建其对象publicvoidshow()/覆盖了其父类的方法/打印输出System.out.println(创建匿名内部类的对象!);/访问匿名内部类中重写的方法out.show();,.,42,InterfaceAclassAAAa=newA()/定义类且创建对象;此时产生的对象是接口A的实现类的对象,.,43,interfaceInterpublicvoidhi();publicclassAnon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论