Java - 接口

接口是Java中的引用类型.它类似于类.它是抽象方法的集合.类实现了一个接口,从而继承了接口的抽象方法.

除了抽象方法,接口还可以包含常量,默认方法,静态方法和嵌套类型.方法体仅适用于默认方法和静态方法.

编写接口类似于编写类.但是一个类描述了对象的属性和行为.接口包含类实现的行为.

除非实现接口的类是抽象的,否则接口的所有方法都需要在类中定义.

接口类似于以下方式的类 :

  • 接口可以包含任何方法数.

  • 接口写入扩展名为 .java 的文件中,接口名称与文件名.

  • 接口的字节代码出现在 .class 文件中.

  • 接口出现在包中,其对应的字节码文件必须位于与包名匹配的目录结构中.

然而,一个界面在几个方面与一个类不同,包括 :

  • 你不能实例化一个接口.

  • 接口不包含任何构造ors.

  • 界面中的所有方法都是抽象的.

  • 界面不能包含实例字段.可以在接口中出现的唯一字段必须声明为static和final.

  • 接口不是由类扩展的;它是由一个类实现的.

  • 一个接口可以扩展多个接口.

声明接口

interface 关键字用于声明接口.下面是一个声明接口的简单示例 :

示例

以下是接口示例 :

/* 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 关键字.

  • 接口中的每个方法也都是隐式抽象的,所以

  • 接口中的方法是隐式公开的.

示例

/* 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

当重写接口中定义的方法时,有要遵循的几条规则;

  • 不应在接口声明的实现方法之外声明已检查的异常接口方法声明的方法或子类.

  • 重写方法时,应保持接口方法的签名和相同的返回类型或子类型.

  • 实现类本身可以是抽象的,如果是,则不需要实现接口方法.

当实现接口时,有几个规则 :

  • 一个类可以实现更多一次只有一个界面.

  • 一个班级可以只扩展一个类,但实现了许多接口.

  • 接口可以扩展另一个接口,类似于类可以扩展另一个类.

扩展接口

接口可以扩展另一个接口,就像类可以扩展另一个类一样. extends 关键字用于扩展接口,子接口继承父接口的方法.

以下体育界面由曲棍球和足球扩展接口.

示例

// 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界面有四种方法,但它继承了两种方法;因此,实现Hockey的类需要实现所有六种方法.类似地,实现Football的类需要定义来自Football的三种方法和来自Sports的两种方法.

扩展多个接口

Java类只能扩展一个父类.不允许多重继承.但是,接口不是类,并且接口可以扩展多个父接口.

extends关键字使用一次,父接口在逗号分隔列表中声明./p>

例如,如果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知道将在事件委托方案中使用此特定接口.

向类添加数据类型 : 这种情况是标记来自的术语.实现标记接口的类不需要定义任何方法(因为接口没有任何方法),但是类通过多态变成了接口类型.