前言:Java程序设计语言中,接口用来对类进行需求描述。它描述了一个类具有的功能。 1、概念:Java中,接口不是类,而是对类的一组需求描述,描述了类具有的功能。接口描述了类所具有的功能,一般不对功能做具体的实现(可以为接口中的方法提供一个默认的实现,使用default修饰符标记方法,JavaSE8允许接口增加静态方法),功能的具体实现由实现接口的类依据各自的需求自行实现。 2、定义和实现接口: (1)定义:Java中使用interface修饰符标记来定义接口。 (2)实现:一个类可以通过关键字implement实现一个或多个接口。实现了接口的类,必须实现接口中所定义的所有未实现的方法,或者必须将类设计为abstract的。 publicinterfaceTestInterfaceA{voidfunTestA();staticvoidfunTestB(){静态方法System。out。print(InterfaceStaticfun);}defaultvoidfunTestC(){默认方法System。out。print(InterfaceDefaultfun);}} 如上,定义了一个接口TestInterfaceA,在这个接口中,定义了一个未实现的方法funTestA,所有实现了这个接口的非抽象类都须实现funTestA方法;funTestB方法是一个静态方法,这是JavaSE8中新增加的特性;funTestC方法用default标记,说明这是一个默认方法,提供了默认实现。 3、默认方法冲突: (1)超类优先:如果一个类的超类和它所实现的接口同时定义了一个同样的方法(同名且同参数,且该方法在接口中被定义为默认方法),那么将以超类的方法为准,接口中定义的默认方法会被忽略。 publicclassSTestA{publicvoidtestDefaultFun(){System。out。print(STestA);}}publicinterfaceITestA{defaultvoidtestDefaultFun(){System。out。print(ITestA);}}publicclassTestImplextendsSTestAimplementsITestA{} 如上,在类STestA和接口ITestA中同时定义一个相同的testDefaultFun方法,类TestImpl继承类STestA并且实现了接口ITestA,此时编译器显示没有问题。当在其他程序中通过TestImpl的一个实例对象调用方法testDefaultFun时,将输出STestA。 (2)接口冲突:如果一个类实现了多个接口(未继承其他超类),在每个接口中都提供了一个同样的默认方法,则类必须覆盖这个方法来解决冲突。 publicinterfaceITestA{defaultvoidtestDefaultFun(){System。out。print(ITestA);}}publicinterfaceITestB{defaultvoidtestDefaultFun(){System。out。print(ITestB);}}publicclassTestImplimplementsITestA,ITestB{OverridepublicvoidtestDefaultFun(){ITestA。super。testDefaultFun();}} 如上,两个接口ITestA和ITestB同时定义了相同的方法testDefaultFun,类TestImpl实现了接口ITestA和ITestB,此时,如果没有在TestImpl类中覆盖方法testDefaultFun,编译器将会报错,当覆盖了这个方法后,编译器报错消失。