接口类和对象掌握Java接口理解Java接口与多态的关系掌握面向接口编程的思想本章目标生活中的接口电脑主板上的PCI插槽的规范就类似于Java接口声卡显卡网卡每种卡的内部结构都不相同,可以把声卡、网卡、显卡都插在PCI插槽上,而不用担心哪个插槽是专门插哪个卡的主板什么是Java接口2-1一个Java接口是一些方法特征的集合,但没有方法的实现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插槽的规范,但行为完全不同什么是Java接口2-2publicclassAssembler{publicstaticvoidmain(String[]args){PCInc=newNetworkCard();PCIsc=newSoundCard();nc.start();sc.start();}}可以使用Java接口标识类型运行时,根据实际创建的对象类型调用相应的方法实现Dudu...Send...控制台输出21为什么需要Java接口5-1为各个学校开发这样一个小系统,包含类型:教员、中心、打印机,具体要求如下:教员、以及中心都具有方法:输出详细信息学校具有属性:打印机,能够通过中心的打印机打印教员或学校的详细信息系统要具备良好的可扩展性与可维护性打印教员学校教员详细信息学校详细信息detail方法(输出详细信息)为什么需要Java接口5-2以下这个解决方案中存在着什么问题?publicclassTeacher1{//输出教员的详细信息publicStringdetail(){return本人是教员;}}publicclassSchool1{privatePrinterprinter=newPrinter();//输出中心的详细信息publicStringdetail(){return“这里是学校;}//使用打印机打印教员信息publicvoidprint(Teacher1t){printer.print(t.detail());}//使用打印机打印中心信息publicvoidprint(School1s){printer.print(s.detail());}}publicclassPrinter{publicvoidprint(Stringcontent){System.out.println(开始打印:);System.out.println(content);}}每增加一种新类型,都需要增加相应的print(类型名称var)方法——程序的可扩展性及可维护性极差——这不符合系统的要求为什么需要Java接口5-3可以通过多态性解决这个问题吗?显然,本系统符合使用多态性的条件教员学校detail方法(负责输出详细信息)教员详细信息学校详细信息1221回顾多态的含义:实现同一个接口,使用不同的实例而执行不同操作为什么需要Java接口5-4在这个系统中,存在继承关系吗?教员、学校属于两种不同的类型,无法通过“is-a”找到一个合适的父类教员、学校都存在一个共同的方法特征:detail,它们对detail方法有各自不同的实现——这完全符合Java接口的定义定义一个Java接口,在其中定义detail方法,但没有具体实现实现这个Java接口,不同的类对detail方法有不同的具体实现IntroduceableTeacher2(教员)School2(学校)为什么需要Java接口5-5publicinterfaceIntroduceable{publicStringdetail();}publicclassSchool2implementsIntroduceable{privatePrinterprinter=newPrinter();//输出中心的详细信息publicStringdetail(){return这里是中心;}//使用中心打印机打印信息publicvoidprint(Introduceableintro){printer.print(intro.detail());}}publicclassTeacher2implementsIntroduceable{//输出教员的详细信息publicStringdetail(){return本人是教员;}}通过Java接口,我们同样可以享受到多态性的好处,大大提高了程序的可扩展性及可维护性使用print方法时,参数可以是任何Introduceable接口的实现类的对象,不必再为不同的类型建立不同的print方法了使用了Java接口之后,这个系统有了怎样的改进?小结1为刚才完成的系统增加一种新的类型:学员(Student),具体要求如下:学员具有detail方法,负责输出学员详细信息能够通过学校的打印机打印学员的详细信息系统要具备良好的可扩展性与可维护性编写测试类StudentTest进行测试,要求:通过学校的打印机打印学员的详细信息什么是面向接口编程开发系统时,主体构架使用接口,接口构成系统的骨架这样就可以通过更换接口的实现类来更换系统的实现publicclassSchool2implementsIntroduceable{privatePrinterprinter=newPrinter();publicStringdetail(){return“这里是学校;}//使用中心打印机打印信息publicvoidprint(Introduceableintro){printer.print(intro.detail());}}IntroduceableTeacher2(教员)School2(中心)面向接口编程的示例4-1升级上述的系统,要求:打印机有多种类型,比如:黑白打印机、彩色打印机等中心可能配备其中任意一款打印机,负责打印教员、或者中心的详细信息系统要具备良好的可扩展性与可维护性print方法(打印)彩色打印机黑白打印机黑白内容学校/教员详细信息彩色内容面向接口编程的示例4-2采用面向接口编程的方式实现,以下是三个步骤中的第一步:抽象出Java接口1、分析:黑白、彩色打印机都存在一个共同的方法特征:print黑白、彩色打印机对print方法有各自不同的实现2、结论:抽象出Java接口PrinterFace,在其中定义方法print3、具体实现:publicinterfacePrinterFace{publicvoidprint(Stringcontent);}面向接口编程的示例4-3采用面向接口编程的方式实现,以下是三个步骤中的第二步:publicclassColorPrinterimplementsPrinterFace{publicvoidprint(Stringcontent){System.out.println(彩色打印:);System.out.println(content);}}publicclassBlackPrinterimplementsPrinterFace{publicvoidprint(Stringcontent){System.out.println(黑白打印:);System.out.println(content);}}实现Java接口1、分析:已经抽象出Java接口PrinterFace,并在其中定义了print方法黑白、彩色打印机对print方法有各自不同的实现2、结论:黑白、彩色打印机都实现PrinterFace接口,各自实现print方法3、具体实现:面向接口编程的示例4-4采用面向接口编程的方式实现,以下是三个步骤中的第三步:使用Java接口1、分析:主体构架使用接口,让接口构成系统的骨架2、结论:更换实现接口的类就可以更换系统的实现3、具体实现:publicclassSchool3implementsIntroduceable{privatePrinterFaceprinter;//打印机publicvoidsetPrinter(PrinterFacep){this.printer=p;}publicStringdetail(){return“这里是学校;}publicvoidprint(Introduceableintro){printer.print(intro.detail());}}publicclassTest{publicstaticvoidmain(String[]args){//创建中心实例School3school=newASchool3();//为该中心配备黑白打印机school.setPrinter(newBlackPrinter());school.print(school);//为该中心配备彩色打印机school.setPrinter(newColorPrinter());school.print(school);}}小结2阅读如下Java代码,然后请采用面向接口编程的思想,在空白处填写正确的代码publicinterfacePCI{voidstart();voidstop();}classSoundCardimplementsPCI{publicvoidstart(){System.out.println(Dudu...);}publicvoidstop(){System.out.println(Soundstop!);}}classNetworkCardimplementsPCI{publicvoidstart(){System.out.println(Send...);}publicvoidstop(){System.out.println(Networkstop!);}}这是Java接口,相当于主板上的PCI插槽的规范声卡、网卡都实现了PCI插槽的规范,但行为完全不同小结2publicclassMainBoard{publicvoidusePCICard(______p){p.start();p.stop();}}publicclassAssembler{publicstaticvoidmain(String[]args){MainBoardmb=newMainBoard();//在主板上插入网卡//在主板上插入声卡}}提示:通过这个方法,主板上可以插入任意符合PCI插槽规范的卡PCInc=newNetworkCard();mb.usePCICard(nc);PCIsc=newSoundCard();mb.usePCICard(sc);PCI提示:可以通过更换实现接口的类来更换系统的实现OO思想总结OO基本特征定义具体实现方式优势封装隐藏实现细节,对外提供公共的访问接口属性私有化、添加公有的setter、getter方法增强代码的可维护性继承从一个已有的类派生出新的类,子类具有父类的一般特性,以及自身特殊的特性继承需要符合的关系:is-a1、实现抽象(抽出像的部分)2、增强代码的可复用性多态同一个实现接口,使用不同的实例而执行不同操作通过Java接口/继承来定义统一的实现接口;通过方法重写为不同的实现类/子类定义不同的操作增强代码的可扩展性、可维护性总结publicinterfaceIntroduceable{publicStringdetail();p