主要内容:1.什么是接口2.接口定义语法3.接口的实现4.接口使用5.一个实际例子:Collection接口接口接口概念接口是数据类型.类是数据类型。使用具体类的名字可以定义类的引用型变量,可以创建对象。对于抽象类,虽然不能创建对象,但是可以定义类的引用型变量。在java语言中还有另一种数据类型,它比抽象类还抽象,这就是接口。接口构造.接口由一组抽象方法构成。在设计一个接口时需要指出接口中每个方法的结果类型,方法名,形参表,这些信息都出现在接口定义中。同时还要指出每个方法的功能。方法的功能是用自然语言描述的,当然不能出现在接口的形式定义中,但是这些功能是接口的一部分,是一种约定(contract),所有实现和使用接口的人都必须遵守的约定。接口与类的比较.类有域(数据成员)和方法(成员函数),在类的外部可以访问的域和方法构成类的约定,它是类的设计者承诺要完成的工作。一个具体类实现了类的全部约定,而一个抽象类只实现了部分约定。接口也规定了一种约定,但是它完全没有实现这个约定。从这个意义上说,接口是完全没有实现的,最抽象的类。接口定义语法.[接口修饰符]interface接口名[extends接口1,…,接口n]接口体这里接口修饰符是public和abstract之一。public修饰符表示该接口可以被任何人使用。abstract修饰符已经被废弃,因为所有接口都隐含地被定义成abstract。如果没有接口修饰符,表示该接口是包可访问的。Interface是java保留字,指示正在定义一个接口。接口名是一个标识符。[extends接口1,…,接口n]是任选的,表示正在定义的接口继承了接口1,…,接口n,这些接口称为新定义接口的超接口,新定义的接口称为每个超接口的子接口。新定义的接口包含超接口的所有方法。java只支持类的单继承,但是支持接口的多继承。所有的类有一个祖先类Object,但是接口没有一个所有接口的共同祖先。接口体含有域和方法。1.所有的域都隐含地定义为public,static,final的,因此不建议使用这些修饰符。2.所有方法都隐含地定义为public,abstract的。因此也不建议使用这些修饰符。例1.这个例子只是从语法上介绍接口及接口的继承。interfaceMysuper{voidf();Objectg();}interfaceMysubextendsMysuper{voidh();}定义Mysuper是一个有两个抽象方法的接口。Mysub是一个继承自Mysuper的接口,它自身定义了一个方法h,从Mysuper继承了方法f和g,所以Mysub有3个方法。所有的方法都是public,abstract。由于接口定义没有访问修饰符,因此接口是包可访问的。接口实现.接口是在定义类时实现的。具体语法如下:[类修饰符]class类名[extends基类名][implements接口1,…,接口n]类体以上是类定义的完整语法,含义是:定义一个名字为“类名”的类,它继承自“基类名”,并且实现了接口1,…,接口n。所谓实现了某接口,指的是它的类体包含接口中所有方法的实现。如果类只是部分实现了接口中的方法,那么这个类就是抽象类,类修饰符中必须含有abstract,否则编译出错。接口的使用.先看一个例子.interface剧场{void显示节目单();void演出();}interface茶馆{void显示茶叶种类();void售茶();}classXimplements剧场,茶馆{……}显然X是带演出的茶馆类?它既可以看成茶馆,也可以看成剧场。Xp=newX();p指向一个带演出的茶馆。剧场q=p;q指向一个带剧团。使用r只能访问剧团接口的方法。茶馆r=p;r指向一个茶馆。使用r只能访问茶馆接口的方法。一般情况下,给定类定义并创建对象classSubextendsSuperimplementsK1,K2{…..}。SubX=newSub();根据以前的知识,可以说X引用的对象是Sub类型的,也可以说这个对象是Sup类型的。因为接口是数据类型,因此也可以说:X引用的对象是K1类型的也是K2类型的。定义接口类型的变量.接口是数据类型,因此可以定义接口类型的变量,该变量是引用类型的。但是不能定义接口类型的对象,因为接口是抽象的。对象的引用.对于任何实现了接口K的类C,接口类型K的变量都可以引用C类型的对象。例.假设有类定义和变量定义classC1implementsK{…..}classC2implementsK{…..}C1x=newC1();C2y=newC2();Kref;不妨假设C1和C2是为不同目的而设计的两个类。那么赋值ref=x和ref=y都是合法的。§2.5.2接口应用举例在Java的SDK中存在名为Collection接口,单词Collection的含义是“收集在一起的一堆东西”,用在Java的SDK中译为“集群”。所谓集群就是一个广义的集合,允许同一个元素多次出现。Collection接口是各类“集群”上所有接口的根。Collection有一个子接口List,它实际表示的是线性表。本节介绍MyCollection接口,它的一个子接口MyList。分别是接口Collection和List的简化。interfaceMyCollection{//add执行结束后,保证该集群中含有obj。真加入,返回true。booleanadd(Objectobj);//从当前集群中删除元素obj。真删除,返回true。booleanremove(Objectobj);//返回一个此集群所有元素上的一个迭代器。Iteratoriterator();}add向集群插入元素,但是没有指出插入位置。remove从集群删除指定元素。方法iterator返回一个迭代器(Iterator),它用于遍历整个集群。显然迭代器与集群的具体实现密切相关,因此Iterator也是一个接口。interfaceMyListextendsMyCollection{//新方法.插入指定的元素到list中,使其成第index个元素。voidadd(intindex,Objectelement);//新方法.删除当前list第index个元素。Objectremove(intindex);}接口MyList继承自MyCollection。表示一个有序的集群,这个接口的用户可以精确控制每个元素的插入位置。用户可以通过整数下标(在list中的位置)访问list中的元素,并能通过下标检索位于list中的元素。这个接口继承了MyCollection中的add方法,但是对其功能做了进一步的限制,要求新元素插入到表尾。同样也继承了方法remove,但保持这个方法在父接口的约定。同时,MyList接口新增加了新方法add(intindex,Objectelement)和Objectremove(intindex),功能是插入新元素到index处和删除当前list第index个元素。Iterator(迭代器)本身也是一个接口,定义如下interfaceIterator{booleanhasNext();//返回true如果还有下一个元素。Objectnext();//返回迭代过程中的下一个元素,voidremove();//从当前集群中删除最后一次调用next方法//时返回的元素,每调用一次next方法,//至多调用一次remove方法。}这些接口的实现将在局部类一节介绍。下面是一个使用ArrayList的简单例子。publicclassTest{publicstaticvoidmain(String[]args){Strings;ArrayLista=newArrayList();//创建一个lista.add(abcd);a.add(efgh);a.add(ijkl);a.add(uvw);a.add(2,1234);Iteratoriter=a.iterator();while(iter.hasNext()){s=(String)iter.next();System.out.println(s);}}}输出是:abcdefgh1234ijkluvw以下是MyList的实现,除去最后的iteratort方法之外都很简单。Iterator方法的实现需要用到局部类的知识,下一节讲解。ArrayList类是MyList接口的数组实现。classArrayListimplementsMyList{privateObject[]list;privateintcount;publicArrayList(){count=0;list=newObject[4];}publicArrayList(intl){count=0;list=newObject[l];}privatevoidenlarge()//当list填满时,容量自动扩大一倍。{Object[]l=newObject[2*list.length];for(inti=0;icount;i++)l[i]=list[i];list=l;}//增强约定.把指定的元素obj连接到list的尾部.publicbooleanadd(Objectobj){if(list.length-1==count)enlarge();list[count++]=obj;returntrue;}//从当前集群中删除元素obj。真的删除了元素,返回true。publicbooleanremove(Objectobj){for(inti=0;icount;i++)if(obj.equals(list[i])){for(intj=i;jcount-1;j++)list[j]=list[j+1];count--;returntrue;}returnfalse;}//新方法.把指定的元素插入到指定位置(index)publicvoidadd(intindex,Objectelement){for(inti=count-1;i=index;i--)list[i+1]=list[i];list[index]=element;}//新方法.删除当前list第index个元素。publicObjectremove(intindex){returnnull;//未实现}//返回一个此List所有元素上的一个Iterator迭代器。publicIteratoriterator(){//局部类定义开始classIterimplementsIterator{intpos;//数组list的下标。Iter(){pos=0;}//局部类构造函数//返回true如果还有下一个元素。publicbooleanhasNext(){returnposcount;}//返回迭代过程中的下一个元素publicObjectnext(){returnlist[pos++];}//从当前集群中删除最后一次调用next方法时返回的元素,//每调用一次next方法,至多调用一次remove方法。publicvoidremove(){for(intj=pos-1;jcount-1;j++)list[j]=list[j+1];count--;}}//局部类定义结束Iteriter=newIter();returniter;}}publicclassclass_main{publicstaticvoidmain(String[]args){student[]g=newstudent[]{newstudent(1,aaa),newstudent(2,bbb),newstudent(3,ccc)};students;ArrayLista=newArrayList();a.add(g[0]);a.add(g[1]);a.add(g[2]);Iteratorit=a.iterator();while(it.hasNext()){s=(student)it.next();System.out.print