您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > interface.
接口生活中的接口电脑主板上的PCI(PeripheralComponentInterconnect外设部件互连标准)插槽的规范就类似于Java接口声卡显卡网卡每种卡的内部结构都不相同,可以把声卡、网卡、显卡都插在PCI插槽上,而不用担心哪个插槽是专门插哪个卡的主板抽象类和抽象方法1、抽象方法★使用关键字abstract修饰的方法称为抽象方法◆例如:abstractvoidf();★区别:方法的声明和方法的实现⑴方法的声明:◆abstractvoidf();⑵方法的实现◆abstractvoidf(){…};◆利用一对大花括号提供方法的实现抽象类和抽象方法2、抽象类⑴抽象类的概念★包含抽象方法的类称为抽象类⑵抽象类的用途★创建抽象类的目的在于:抽象类为它的所有导出类创建了一个通用接口◆不同的子类使用不同的方式实现此接口⑶抽象类的重要性质Ⅰ不能为抽象类创建其对象★否则,编译器就会报错Ⅱ如果继承一个抽象类并试图创建该类的对象,那么就必须为基类中的所有抽象方法提供方法定义★如果不这么做(可选择不做),那么导出类便也是抽象类★abstractclassInstrument//抽象类{privateinti;//抽象方法publicabstractvoidplay(Noten);publicabstractvoidadjust();publicStringwhat()//抽象类中可以包含非抽象方法{return“Instrument”;}}★classWindextendsInstrument{//为基类抽象方法提供方法的实现publicvoidplay(Noten){print(“Wind.play()”+n);}publicvoidadjust(){}publicStringwhat()//覆盖基类继承下来的方法{return“Wind”;}}.....二、接口1、接口(Interface)的概念接口(interface)为我们提供了一种用来组织和控制系统中的对象的更加精致的方法。C++中不包含这种机制。★在Java中,可以使用interface关键字来创建一个完全抽象的类◆区别:抽象类与接口2、接口的创建★接口是一种特殊的类,但在创建时使用interface关键字interfaceInstrument{//隐式为static&finalintVALUE=5;//只能有声明,不能有具体的定义和实现//缺省为publicvoidplay(Noten);voidadjust();}★归纳:1、接口也可以包含域,这些域隐式为static和final◆但现在很少在接口中包含域2、只能有方法的声明,不能有具体的定义和实现◆只允许创建者确定方法名、参数列表和返回类型,但是不能有任何的方法体3、interface的访问权限控制有两种:◆Public◆缺省(包访问权限控制)4、interface中方法的访问权限控制只有一种◆public(缺省),否则编译器报错接口接口的实现要让一个类实现某个特定的接口或者是一组接口需要使用implements关键字publicinterfacePCI{publicvoidstart();publicvoidstop();}classSoundCardimplementsPCI{publicvoidstart(){System.out.println(Dudu...);}publicvoidstop(){System.out.println(Soundstop!);}}Java接口中定义的方法在不同的地方被实现,可以具有完全不同的行为这是Java接口,相当于主板上的PCI插槽的规范classNetworkCardimplementsPCI{publicvoidstart(){System.out.println(Send...);}publicvoidstop(){System.out.println(Networkstop!);}}声卡、网卡都实现了PCI插槽的规范,但行为完全不同publicclassAssembler{publicstaticvoidmain(String[]args){PCInc=newNetworkCard();PCIsc=newSoundCard();nc.start();sc.start();}}可以使用Java接口标识类型运行时,根据实际创建的对象类型调用相应的方法实现Dudu...Send...控制台输出classWindimplementsInstrument{//接口抽象方法的具体实现publicvoidplay(Noten){print(this+“.play()”+n);}//接口抽象方法的具体实现publicvoidadjust(){print(this+“.adjust()”);}//可以在派生类中增加新的方法publicStringtoString(){return“Wind”;}}.....publicclassMusic4{staticvoidtune(Instrumenti){i.play(Note.MIDDLE_C);}//Instrumenti的含义并不是:利用Instrument类型来声明一个对象i,因为接口不能实例化//Instrumenti的含义是:声明这样的一个引用i,该引用指向实现了Instrument接口的类的实例staticvoidtuneAll(Instrument[]e){for(inti=0;ie.length;i++)tune(e[i]);}//利用For循环对Instrument数组进行存取publicstaticvoidmain(String[]args){//声明一个数组orchestra(管弦乐队)//该数组是一个引用数组,用来指向实现了//Instrument接口的类的实例Instrument[]orchestra={newWind(),newPercussion(),//打击乐器…};tuneAll(orchestra);}}JAVA中的多重继承1、基本原则★Java不支持多重继承◆而是使用多重接口来实现类似多重继承的机制2、多重接口的定义★class派生类extends[基类][implements接口1,接口2,...接口n]◆注意:[]表示可选项Adventure.javainterfaceCanFight//能打{voidfight();}interfaceCanSwim//能游{voidswim();}interfaceCanFly//能飞{voidfly();}classActionCharacter//动作演员{publicvoidfight(){}}classHeroextendsActionCharacterimplementsCanFight,CanSwim,CanFly{publicvoidswim(){}publicvoidfly(){}}//当想要创建对象时,所有的声明首先都必须实现//注意:虽然Hero并没有提供fight()的定义,但可从ActionCharacter继承而来,这就使创建Hero对象成为了可能publicclassAdventure{publicstaticvoidt(CanFightx){x.fight();}publicstaticvoidu(CanSwimx){x.swim();}publicstaticvoidv(CanFlyx){x.fly();}publicstaticvoidw(ActionCharacterx){x.fight();}publicstaticvoidmain(String[]args){Heroh=newHero();//依次向上转型为每一个接口t(h);u(h);v(h);w(h)}}★归纳:1、接口的作用⑴能够向上转型为多个基类型⑵防止客户端程序员创建该类的对象2、如果想要创建不带任何方法定义和成员变量的基类,我们的第一选择是接口而不是抽象类通过继承来扩展接口一个接口“extends”另一个接口interfaceMonsterinterfaceDangerousMonsterclassDragonZillainterfaceLathalinterfaceVampire//:HorrorShow.java//ExtendinganinterfacewithinheritanceinterfaceMonster{voidmenace();}interfaceDangerousMonsterextendsMonster{voiddestroy();}interfaceLethal{voidkill();}classDragonZillaimplementsDangerousMonster{publicvoidmenace(){}publicvoiddestroy(){}}interfaceVampireextendsDangerousMonster,Lethal{voiddrinkBlood();}classHorrorShow{staticvoidu(Monsterb){b.menace();}//b不是Mon的引用,它是指向实现了该接口的引用staticvoidv(DangerousMonsterd){d.menace();d.destroy();}publicstaticvoidmain(String[]args){DragonZillaif2=newDragonZilla();u(if2);v(if2);}}///:~接口中的域证明:接口中的域隐式地是static和final的interfaceDays{intSUNDAY=1,MONDAY=2,TUESDAY=3,WEDNESDAY=4,THURSDAY=5,FRIDAY=6,SATURDAY=7;}classWeekimplementsDays{privatestaticintcount=0;privateintid=count++;publicWeek(){System.out.println(Week()+id);}}publicclassEx17{publicstaticvoidmain(String[]args){//Withoutanyobjects,staticfieldsexist:System.out.println(SUNDAY=+Days.SUNDAY);System.out.println(MONDAY=+Days.MONDAY);Weekw0=newWeek();Weekw1=newWeek();//Error:cannotassignavaluetofinalvariableSUNDAY://w0.SUNDAY=2;//Error:cannotassignavaluetofinalvariableMONDAY://w1.MONDAY=w0.MONDAY;}}嵌套接口嵌套接口分两种:嵌套在类里面和嵌套在接口里面。嵌套在类里面可以包括public、private、packet类型的接口。当为private类型的接口时,只能在本类中实现为public类或者private类,当实现为public类时,外界无法直接访问该类的接口,可以通过set/get方法来访问。嵌套在接口里面时,不用实现嵌套接口,只要实现本接口方法就行了。且嵌套接口不必须都是public类型的。在Java接口中声明常量在Java接口中声明的变量在编译时会自动加上staticfinal的修饰符,即声明为常量,因而Java接口通常是存放常量的最佳地点publicinterfaceSMUSchoolType{publicstaticfinalStringCIE=“软件学院;publicstaticfinalStringCIECall=“计算机科学技术学院;}publicinterfaceJLUSchoolType{StringCIE=“软件学院;StringCIECall
本文标题:interface.
链接地址:https://www.777doc.com/doc-2878882 .html