第6章接口与多态6.1接口 Java中的接口就是定义了若干个抽象方法和常量,形成一个属性集合,该属性集合通常对应某一组功能,可以实现类似于类的多重继承功能。其格式为:6.11接口的声明与使用1.接口声明[public]interface接口名[extends父接口名列表]{ //接口体 //常量声明//抽象方法声明}2.接口体 接口体中包含常量的声明和方法定义两部分。接口声明时的注意事项1.在Java中接口是一种专门的类型,用interface关键字定义接口。2.接口中只能定义抽象方法,而且访问权限一定是公有的,在定义时可省略public和abstract修饰符。3.接口中可以定义变量,但实际上是publicfinal修饰的常量。4.接口中不能定义静态方法。3.接口的使用•在Java语言中,接口由类去实现以便使用接口中的方法,一个类可以实现多个接口,类通过使用关键字implements声明自己实现一个或多个接口。如果实现多个接口,则用逗号隔开接口名。•如果一个类实现了某个接口,那么这个类必须重写该接口的所有方法。需要注意的是,重写接口的方法时,接口中的方法一定是publicabstract方法,所以类在重写接口方法 时不仅要去掉abstract修饰、给出方法体,而且方法访问权限一定要显式地用显式地用显式地用显式地用publicpublicpublicpublic来修饰来修饰来修饰来修饰。•类重写的接口方法以及接口中的常量可以被类的对象调用,而且常量也可以用类名或接口名直接调用。•接口声明时,如果关键字interface前加下public,就称这样的接口是一个public接口。public接口可以被任何一个类实现。如果一个接口不加public修饰,就是友好接口,只能被同一包中的类实现。•如果实现了某个接口,那么子类也就自然实现了该接口,子类不必于地使用关键字implements声明实现这个接口。•如果一个类声明实现一个接口,但没有重写串的所有方法,那么这个类必须是abstract类。例:接口的使用•interfacecomputable•{•intMAX=100;•intf(intx);•}•classchinaimplementscomputable•{•intnumber;•publicintf(intx)•{•returnx+43;•}•}•publicclassexample6•{•publicstaticvoidmain(Stringargs[])•{•chinac=newchina();•c.number=48+computable.MAX;•System.out.println(Chinesestudent:+c.f(4));•}接口的继承性•与类相仿,接口也具有继承性。定义一个接口时可以通过extends关键字声明该新接口是某个已经存在的父接口的派生接口,它将继承父接口的所有属性和方法。•与类的继承不同的是一个接口可以有一个以上父接口,它们之间用逗号分隔,形成父接口列表。新接口将继承所有父接口中属性和方法。类实现接口的注意事项1.在类的声明部分,用implements关键字声明该类将要实现哪些接口。2.如果实现某接口的类不是abstract抽象类,则在类的定义部分必须实现指定接口所有抽象方法。3.如果实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。4.一个类在实现某接口的抽象方法时,必须使用完全相同的方法名。5.接口抽象访问限制符都已制定为public,所以类在实现方法时,必须显式地使用public修饰符。1.interfaceA2.{3.inta=1;4.}5.interfaceB6.{7.intb=2;8.voidpp();9.}interfaceMyInterfaceextendsA,B{}abstractclassAbstractInterfaceExamimplementsA,B{}publicclassInterfaceExamextendsAbstractInterfaceExam//implementsMyInterface//A,B1.publicclassInterfaceExamextendsAbstractInterfaceExamimplementsMyInterfaceA,B2.{3.4.publicstaticvoidmain(String[]args)5.{6. InterfaceExamobj=newInterfaceExam();7. System.out.println(继承接口A中的a=+obj.a);8.obj.pp();9.}10.publicvoidpp()11.{12.System.out.println(继承接口B中的b=+.b);13.}14.}几点说明1.制定模块与模块之间的通信协议,一个定义多人实现。2.接口做方法的参数时,其实参要用它的实现类。3.接口的数据成员都静态常量,通过接口名,实现类和对象都可以进行访问。访问时点运算符。6.2接口的回调接口回调是指:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口方法。•interfaceShowMessage•{•voidShowTrademark(Strings);•}•classTVimplementsShowMessage•{•publicvoidShowTrademark(Strings)•{•System.out.println(s);•}•}•publicclassexample63•{•publicstaticvoidmain(Stringargs[])•{•ShowMessagesm;•sm=newTV();•sm.ShowTrademark(长虹牌电视机);•}•}6.2.2接口的多态性•接口的多态性是不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在架设接口依法时就可能具有多种形态。6.2.3接口与抽象类的比较1.接口不能包含任何可以执行的方法,而抽象类可以。2.接口中只可以有常量,不能有变量;而abstract类中可以有变量。3.类可以实现多个接口,但只能有一个父类。4.接口不是类分级结构的一部分,而没有联系的类可以执行相同的接口。6.3面向接口编程•仍然使用开-闭原则进行程序设计,即对扩展开放,对修改关闭。具体步骤是:1.问题的分析2.设计接口3.设计实现类