Java - 接口
接口是 Java 中的引用类型。它类似于类。它是抽象方法的集合。一个类实现了一个接口,从而继承了接口的抽象方法。
除了抽象方法,接口还可以包含常量、默认方法、静态方法和嵌套类型。方法体只存在于默认方法和静态方法中。
编写接口类似于编写类。但是一个类描述了一个对象的属性和行为。接口包含类实现的行为。
除非实现接口的类是抽象类,否则接口的所有方法都需要在类中定义。
接口在以下方面类似于类 -
-
一个接口可以包含任意数量的方法。
-
一个接口写在一个带有 .java 的文件中 扩展名,接口名与文件名匹配。
-
接口的字节码出现在 .class 中 文件。
-
接口出现在包中,其对应的字节码文件必须在与包名匹配的目录结构中。
然而,接口在几个方面与类不同,包括 -
-
你不能实例化一个接口。
-
接口不包含任何构造函数。
-
接口中的所有方法都是抽象的。
-
接口不能包含实例字段。可以出现在接口中的唯一字段必须声明为静态和最终的。
-
接口不被类扩展;它是由一个类实现的。
-
一个接口可以扩展多个接口。
声明接口
界面 关键字用于声明接口。这是一个声明接口的简单示例 -
示例
以下是一个接口示例 -
/* File name : NameOfInterface.java */ import java.lang.*; // Any number of import statements public interface NameOfInterface { // Any number of final, static fields // Any number of abstract method declarations\ }
接口具有以下属性 -
-
接口是隐式抽象的。您不需要使用 abstract 声明接口时的关键字。
-
接口中的每个方法也是隐式抽象的,所以不需要abstract关键字。
-
接口中的方法是隐式公开的。
示例
/* File name : Animal.java */ interface Animal { public void eat(); public void travel(); }
实现接口
当一个类实现一个接口时,你可以把这个类看作是签订了一份契约,同意执行接口的具体行为。如果一个类不执行接口的所有行为,则该类必须将自己声明为抽象。
一个类使用实现 关键字来实现接口。 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
重写接口中定义的方法时,需要遵循几条规则 -
-
除了接口方法声明的实现方法或接口方法声明的子类之外,不应在实现方法上声明受检异常。
-
重写方法时应保持接口方法的签名和相同的返回类型或子类型。
-
实现类本身可以是抽象的,如果是这样,接口方法就不需要实现了。
实现接口时,有几条规则 -
-
一个类一次可以实现多个接口。
-
一个类只能扩展一个类,但可以实现多个接口。
-
一个接口可以扩展另一个接口,就像一个类可以扩展另一个类一样。
扩展接口
一个接口可以扩展另一个接口,就像一个类可以扩展另一个类一样。 扩展 关键字用于扩展接口,子接口继承父接口的方法。
以下 Sports 接口由 Hockey 和 Football 接口扩展。
示例
// Filename: Sports.java public interface Sports { public void setHomeTeam(String name); public void setVisitingTeam(String name); } // Filename: Football.java public interface Football extends Sports { public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter); } // Filename: 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 类只能扩展一个父类。不允许多重继承。然而,接口不是类,一个接口可以扩展多个父接口。
extends 关键字使用一次,父接口以逗号分隔的列表声明。
例如,如果 Hockey 接口同时扩展了 Sports 和 Event,它将被声明为 -
示例
public interface Hockey extends Sports, Event
标记接口
当父接口不包含任何方法时,最常使用扩展接口。例如java.awt.event包中的MouseListener接口扩展了java.util.EventListener,定义为-
示例
package java.util; public interface EventListener {}
没有方法的接口称为标记 界面。标记接口有两个基本的设计目的 -
创建一个共同的父级 − 与由Java API 中的许多其他接口扩展的EventListener 接口一样,您可以使用标记接口在一组接口之间创建一个公共父级。例如,当一个接口扩展 EventListener 时,JVM 知道这个特定的接口将用于事件委托场景。
向类添加数据类型 − 这种情况是术语标签的来源。实现标记接口的类不需要定义任何方法(因为接口没有任何方法),但类通过多态成为接口类型。
java