接口是Java中的引用类型。它类似于类。它是抽象方法的集合。一个类实现一个接口,从而继承该接口的抽象方法。
除抽象方法外,接口还可以包含常量,默认方法,静态方法和嵌套类型。方法主体仅适用于默认方法和静态方法。
编写接口类似于编写类。但是类描述了对象的属性和行为。接口包含类实现的行为。
除非实现该接口的类是抽象的,否则需要在该类中定义接口的所有方法。
接口在以下方面类似于类:
接口可以包含许多方法。
接口以扩展名.java写入文件,接口名称与文件名匹配。
接口的字节码显示在.class文件中。
接口出现在程序包中,并且它们的相应字节码文件必须位于与程序包名称匹配的目录结构中。
但是,接口在某些方面与类有所不同,包括-
您不能实例化接口。
接口不包含任何构造函数。
接口中的所有方法都是抽象的。
接口不能包含实例字段。必须在接口中出现的唯一字段必须声明为static和final。
接口不是由类扩展的;它由一个类实现。
一个接口可以扩展多个接口。
的接口关键字用于声明的接口。这是一个声明接口的简单示例-
以下是接口的示例-
/* File name : NameOfInterface.java */ import java.lang.*; //任意数量的导入语句 public interface NameOfInterface { //任意数量的最终静态字段 //任意数量的抽象方法声明\ }
接口具有以下属性-
接口是隐式抽象的。声明接口时无需使用abstract关键字。
接口中的每个方法也是隐式抽象的,因此不需要abstract关键字。
接口中的方法是隐式公共的。
/* File name : Animal.java */ interface Animal { public void eat(); public void travel(); }
当一个类实现一个接口时,您可以将其视为签订合同,同意执行该接口的特定行为。如果一个类不能执行接口的所有行为,则该类必须将自身声明为抽象。
一个类使用Implements关键字实现一个接口。Implements关键字出现在类声明中,位于声明的扩展部分之后。
/* File name : MammalInt.java */ public class MammalInt implements Animal { public void eat() { System.out.println("Mammal eats"); } public void travel() { System.out.println("Mammal travels"); } public int noOfLegs() { return 0; } public static void main(String args[]) { MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
这将产生以下结果-
输出结果
Mammal eats Mammal travels
当重写接口中定义的方法时,要遵循以下规则-
除了接口方法声明的异常或接口方法声明的子类之外,不应在实现方法上声明检查的异常。
覆盖方法时,应保留接口方法的签名以及相同的返回类型或子类型。
实现类本身可以是抽象的,如果是这样,则不需要实现接口方法。
当实现接口时,有几个规则-
一个类一次可以实现多个接口。
一个类只能扩展一个类,但可以实现许多接口。
一个接口可以扩展另一个接口,就像类可以扩展另一个类一样。
一个接口可以像扩展一个类一样扩展另一个接口。 延伸关键字用于扩展接口,而子接口继承父接口的方法。
曲棍球和足球接口扩展了以下“体育”接口。
// Filename: Sports.java public interface Sports { public void setHomeTeam(String name); public void setVisitingTeam(String name); } //文件名:Football.java- public interface Football extends Sports { public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter); } //文件名:Hockey.java- public interface Hockey extends Sports { public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot); }
Hockey接口有四个方法,但它从Sports继承了两个;因此,实现Hockey的类需要实现所有六个方法。同样,实现Football的类需要定义Football的三种方法和Sports的两种方法。
Java类只能扩展一个父类。不允许多重继承。接口不是类,但是,一个接口可以扩展多个父接口。
extend关键字仅使用一次,并且父接口在逗号分隔的列表中声明。
例如,如果Hockey接口同时扩展了Sports和Event,则将其声明为-
public interface Hockey extends Sports, Event
当父接口不包含任何方法时,将发生扩展接口的最常见用法。例如,java.awt.event包中的MouseListener接口扩展了java.util.EventListener,其定义为-
package java.util; public interface EventListener {}
其中没有方法的接口称为标记接口。标记接口有两个基本设计目的-
创建一个公共父类-与EventListener接口一样,它通过Java API中的数十个其他接口进行了扩展,您可以使用标记接口在一组接口之间创建一个公共父类。例如,当接口扩展EventListener时,JVM知道该特定接口将在事件委托场景中使用。
将数据类型添加到类中-这种情况是术语“标签”的来源。实现标记接口的类不需要定义任何方法(因为该接口没有任何方法),但是该类通过多态性成为接口类型。