《J接口和内部类》PPT课件.ppt_第1页
《J接口和内部类》PPT课件.ppt_第2页
《J接口和内部类》PPT课件.ppt_第3页
《J接口和内部类》PPT课件.ppt_第4页
《J接口和内部类》PPT课件.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

接口和内部类Interfacesvoidmethod2();一个抽象类甚至可以没有抽象方法只要包含有abstract方法,类就必须被声明为abstract,否则就不能编译。,抽象类的语法,6,abstractclassAnimalKingdomprivateStringphylum;publicAnimalKingdom(Stringp)phylum=p;publicStringgetPhylum()returnphylum;publicabstractvoideat();,抽象类:例,定义抽象方法的类必须是抽象类。抽象类中的抽象的方法-在该类中定义但不在该类中提供实现,由继承类提供细节。,7,抽象类和方法,可以有数据和定义,不可以创建实例,必须定义所有的abstract方法才可以被实例化(否则类仍然是abstract类),8,abstractInstrument,一些方法和数据可以被定义剩余其它代码是一样的,abstractclassInstrumentprivateinti;/Storageallocatedforeachpublicabstractvoidplay(Noten);publicStringwhat()returnInstrument;publicabstractvoidadjust();,9,接口(interface)和抽象(abstract)类有什么不同?为什么都存在与Java中?什么时候该用一个抽象类,什么时候改用一个接口?,问题?,接口Interfaces,11,接口,“纯(pure)”abstractclass完全抽象的类允许创建者象建立一个类一样进行创建:methodnames,argumentlists,andreturntypes,butnomethodbodies.canalsocontainfields,buttheseareimplicitlystaticandfinal.常量“所有实现了该特定接口的类看起来都像这样”interfacepublicvoidkeyReleased(KeyEvente);publicvoidkeyTyped(KeyEvente);,一个接口描述方法但不提供方法的具体实现方法名、参数列表和返回类型,13,例,ordinaryclass,14,例代码,interfaceInstrument/Compile-timeconstant:intI=5;/staticpublicvoidadjust(),Otherclassesaresimilar,15,完全解耦,只要一个方法操作的是类而非接口,那么就只能使用这个类及其子类。如果想要将这个方法应用于不在此继承结构中的某个类:接口可以在很大程度上放宽这种限制。策略模式,16,策略模式,创建一个能够根据所传递对象的不同而具有不同行为的方法,被称为策略设计模式。方法包含所有执行的算法中固定不变的部分“策略”包含变化的部分。策略就是传递进去的参数对象,它包含要执行的代码。,17,Adapter(适配器)模式,适配器模式是一种结构型模式,主要应对:由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是,新环境要求的接口是现存对象所不满足的。例:我们常使用的移动硬盘,无论是笔记本硬盘还是台式机硬盘,对于数据的传输都不使用Usb的数据线,外接的硬盘盒就是将原来的硬盘数据传输方式适合Usb数据线。将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。,18,Java中的多重继承,没有任何与接口相关的存储,因此也就无法阻止多个接口的组合。C+中,组合多个类的接口的行为被称为多重继承。它可能会使你背负很沉重的包袱,因为每个类都有一个实现。Java中只有一个类有具体实现。,19,例:Adventure,interfaceCanFightvoidfight();interfaceCanSwimvoidswim();interfaceCanFlyvoidfly();classActionCharacterpublicvoidfight(),classHeroextendsActionCharacterimplementsCanFight,CanSwim,CanFlypublicvoidswim()publicvoidfly(),Whenyoudefineanewinterface,youaredefininganewreferencedatatype.,20,例:Adventure(续),publicclassAdventurepublicstaticvoidt(CanFightx)x.fight();publicstaticvoidu(CanSwimx)x.swim();publicstaticvoidv(CanFlyx)x.fly();publicstaticvoidw(ActionCharacterx)x.fight();publicstaticvoidmain(Stringargs)Heroh=newHero();t(h);/TreatitasaCanFightu(h);/TreatitasaCanSwimv(h);/TreatitasaCanFlyw(h);/TreatitasanActionCharacter,UsinganInterfaceasaType,21,通过继承来扩展接口,interfaceMonstervoidmenace();interfaceDangerousMonsterextendsMonstervoiddestroy();interfaceLethalvoidkill();classDragonZillaimplementsDangerousMonsterpublicvoidmenace()publicvoiddestroy()interfaceVampireextendsDangerousMonster,LethalvoiddrinkBlood();,asimpleextension,onlywheninheritinginterfaces,22,组合接口时的名字冲突,interfaceI1voidf();interfaceI2intf(inti);interfaceI3intf();classCpublicintf()return1;classC2implementsI1,I2publicvoidf()publicintf(inti)return1;/overloadedclassC3extendsCimplementsI2publicintf(inti)return1;/overloadedclassC4extendsCimplementsI3/Identical,noproblem:publicintf()return1;/Methodsdifferonlybyreturntype:/!classC5extendsCimplementsI1/!interfaceI4extendsI1,I3,interfacesI3andI1areincompatible;bothdefinef(),butwithdifferentreturntype,23,群组常量,接口中的域是public,static和final的,所以接口就称为了一种很便捷的用来创建常量组的工具JavaSE5之前要产生类似C或C+中enum(JavaSE5)类型publicinterfaceMonthsintJANUARY=1,FEBRUARY=2,MARCH=3,APRIL=4,MAY=5,JUNE=6,JULY=7,AUGUST=8,SEPTEMBER=9,OCTOBER=10,NOVEMBER=11,DECEMBER=12;不必显式指定public,24,初始化接口中的域,自动static和final不可以是“空final”可以被非常量表达式初始化既然是static的,它们就可以在类第一次被加载时初始化,Thefieldsarenotpartoftheinterface.Thevaluesarestoredinthestaticstorageareaforthatinterface.,25,嵌套接口,接口可以嵌套在类或其他接口中。classAinterfaceBvoidf();publicclassBImpimplementsBpublicvoidf()interfaceEinterfaceGvoidf();,publicclassNestingInterfacespublicclassBImpimplementsA.Bpublicvoidf(),classEImp2implementsEpublicvoidg()classEGimplementsE.Gpublicvoidf(),26,再看接口,interfaceKeyListenerpublicvoidkeyPressed(KeyEvente);publicvoidkeyReleased(KeyEvente);publicvoidkeyTyped(KeyEvente);,27,适配器,classKeyAdapterimplementsKeyListenerpublicvoidkeyPressed(KeyEvente);publicvoidkeyReleased(KeyEvente);publicvoidkeyTyped(KeyEvente);,28,接口练习,P179练习12P181练习14,内部类InnerClasses,30,内部类,可以将一个类的定义放在另一个类的定义内部,这就是内部类。内部类是非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。与组合完全不同。SinceJDK1.1Asaresult,theyarenotaswelldoneassomeotheraspectsofthelanguage,31,内部类,Someonetosharemymostprivatethoughts(andvariablesandmethods).SomeonewhoknowsEVERYTHINGaboutme.Anintimaterelationshipsharedbetweentwoobjects-anouterandaninner.Youdonthavetomakeaninstanceofaninnerclassinordertohaveaninstanceoftheouterclass.ButyoucanNEVERmakeaninstanceofmyinnerclasswithoutanouterobjecttobinditto.Outerobjectscanhaveseveralinnerobjects.,32,内部类,把一个类的定义置于另一个外围类的里面。包含内部类的类称为外部类。与一般的类一样,内部类可以有自己的成员变量和成员方法。使用内部类必须要先了解内部类与包围它的外部类之间的关系,以及它们之间的成员如何实现相互访问。如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么就必须具体地指明这个对象的类型:OuterClassName.InnerClassName,33,内部类,classOuterprivateintsize;/外部类的成员变量privateStringthoughts=Myouterthoughts;classInner/声明内部类StringinnerThoughts=Myinnerthoughts;/内部类的成员变量voiddoStuff()/内部类的成员方法/innerobjecthasitsownthisSystem.out.println(innerThoughts);/anditalsohasakindofouterthis/evenforprivatedataofouterclassSystem.out.println(thoughts);,34,内部类,classTestMepublicstaticvoidmain(Stringargs)/instantiateme,theouterobjectOutero=newOuter();/Inneri=newInner();/NO!CantinstantiateInnerbyitself!Outer.Inneri=o.newInner();/nowIhavemyspecialinnerobjecti.doStuff();/OKtocallmethodsoninnerobject,Youcanalsoinstantiateboththeouterclassandinnerclassatthesametime:Outer.Inneri=newOuter().newInner();,35,内部类的特性,Java将内部类作为外部类的一个成员,就如同其成员变量与成员方法一样;所以,一般类只能是public和非public(缺省),而内部类可以指定为private和protected;如果内部类为private,只有本类可以使用它;如果内部类为protected,只有外层类、与外层类处于同一包中的类、以及外层类的子类可以访问它;内部类可以实现接口及抽象类中的抽象方法外层类可以将上述实现细节乃至内部类都隐藏起来,给外界提供接口,36,嵌套类的访问规则,内部类与外部类的访问规则内部类与外部类各有自己的成员;在外部类中,通过内部类对象引用内部类;在外部类的main方法或其他类中访问内部类,在必须给出内部类的完整名字,如,Group1.Student在内部类中,可以直接引用外部类的所有成员,包括外部类的静态成员、实例成员以及私有成员;,37,嵌套类的访问规则,publicclassGroup2privateintcount;publicclassStudentStringname;publicStudent(Stringn1)name=n1;count+;publicvoidoutput()System.out.print(+);publicvoidoutput()Students1=newStudent(李明);s1.output();System.out.println(count=+this.count);publicstaticvoidmain(Stringargs)Group2g2=newGroup2();g2.output();Group2.Students=newGroup2.Student(李四);s.output();,声明内部类,访问其外部类的成员变量,内部类的成员:name,output(),编译出错,因在静态方法main中,不能访问非静态成员类Student的构造方法,创建内部类对象,并通过内部类对象访问内部类成员,外部类方法,与内部类方法同名,问题:该语句能否正确执行,38,内部类的特性,内部类可以定义为抽象类型但需要被外部类的其他内部类继承与实现内部类可以是一个接口但这个接口需要被外部类的其他内部类实现,39,publicclassGroup5publicinterfaceStudent_infopublicvoidoutput();publicclassStudentimplementsStudent_infointcount;Stringname;publicStudent(Stringn1)name=n1;count+;publicvoidoutput()System.out.println(+count=+this.count);publicGroup5(Stringname1)Students1;inti=0;while(i0)g5=newGroup5(args);,内部接口,实现内部接口内部类,内部类的构造方法,实现接口方法,外部类的构造方法,外部类引用内部类:创建内部类对象,通过内部类对象访问内部类方法,40,运行并输入参数,输出结果由于count是实例成员,不能纪录创建对象的个数,41,静态嵌套类,顶层嵌套类classOuterstaticclassInner静态嵌套类只与外部类有关,而不是外部类的实例。Outer.Inneri=newOuter.Inner();要访问外部类中的非静态成员,则必须在内部类创建外部类的对象,通过对象名访问外部非静态成员非静态内部类不能声明静态成员,只有静态内部类才可以声明静态成员;由于内部类被声明为静态后无法正常访问外部类非静态成员,受到很大的限制,42,使用静态内部类的原因,需要在内部类定义静态成员;希望隐藏内部类;避免类名重复在开发大型应用程序时需要设计大量的类,类存在重名的可能为了避免这种情况,可以把可能重名的类设置为static、public的内部类其他类在引用时要使用完成的内部类名标识(外部类名.内部类明),这样就避免了类名重复。,43,publicclassGroup6publicstaticclassStudentstaticintcount;Stringname;intnumber;publicStudent(Stringn1)name=n1;count+;number=count;publicvoidoutput()System.out.println(+number=+this.number);publicstaticvoidmain(Stringargs)Group6.Students1=newGroup6.Student(A);s1.output();Group6.Students2=newGroup6.Student(B);s2.output();,定义静态公用内部类,静态内部类中的静态变量,纪录创建对象的序号,静态内部类的构造方法,创建一个对象序号自动增加,在静态main方法中,通过完整的内部类标示符创建内部类对象,44,在静态main方法中,通过完整的内部类标示符Group6.Student创建内部类对象,并使用静态成员变量记录创建对象的序号,45,静态内部类的特殊用法,编译上面源程序Group6.Java,查看类的字节码文件,不但有编译后产生的类Group6的字节码文件Group6.class,还产生一个名字为Group6$Student.class的文件,嵌套类的字节码文件名是以外部类名和“$”开头,接着是嵌套类的名字在开发应用程序时需要编写大量的类,并需要对这些类进行调试、演示根据静态内部类的特点,在编写一个类时,在类中可以定义一个静态内部类作为一个独立的、可选的辅助功能,如,用作代码的测试和演示,方便而有效,46,publicclassOuter/外部类privateinti

温馨提示

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

最新文档

评论

0/150

提交评论