Java 接口

Java 接口是抽象方法的集合。该接口用于实现抽象,您可以在其中定义方法而无需其实现(无需方法的主体)。接口是一种引用类型,类似于类。

除了抽象方法之外,接口还可以还包含常量、默认方法、静态方法和嵌套类型。方法体仅存在于默认方法和静态方法中。

编写接口与编写类类似。然而,类描述了对象的属性和行为。接口包含类实现的行为。除非实现接口的类是抽象的,否则接口的所有方法都需要在类中定义。

Java接口和类:异同

相似点

接口在以下方面与类相似 

  • 接口可以包含任意数量的方法。

  • 接口编写在扩展名为 .java 的文件中,接口名称与文件名称匹配。

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

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

差异

但是,接口在几个方面与类不同,包括 

  • 您无法实例化接口。

  • 接口不包含任何构造函数。

  • 接口中的所有方法都是抽象的。

  • 接口不能包含实例字段。接口中唯一可以出现的字段必须声明为静态和最终的。

  • 接口不能由类扩展;接口不能由类扩展;接口不能由类扩展;接口不能由类扩展。它由类实现。

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

在 Java 中声明接口

interface关键字用于声明接口。这是一个声明接口的简单示例 

声明 Java 接口的示例

以下是接口的示例 -

/* 文件名 : NameOfInterface.java */
import java.lang.*;
// 任意数量的 import 语句

public interface NameOfInterface {
   // 任意数量的最终静态字段
   //任意数量的抽象方法声明\
} 

Java 接口的属性

接口具有以下属性 

  • 接口是隐式抽象的。声明接口时不需要使用abstract关键字。

  • 接口中的每个方法也是隐式抽象的,因此abstract关键字是不需要。

  • 接口中的方法隐式公开。

示例

/* 文件名 : Animal.java */
interface Animal {
   public void eat();
   public void travel();
} 

实现Java中的接口

当一个类实现了一个接口时,你可以认为该类签署了一份契约,同意执行该接口的特定行为。如果一个类不执行接口的所有行为,则该类必须将自己声明为抽象类。

类使用implements关键字来实现接口。 Implements 关键字出现在类声明中声明的 extends 部分之后。

示例:在 Java 中实现接口

/* 文件名 : 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();
   }
} 
interface Animal {
   public void eat();
   public void travel();
} 

输出

Mammal eats
Mammal travels 

定义规则Java 接口中的重写方法

当在接口中定义重写方法时,需要遵循以下几条规则 -

  • 除了接口方法声明的方法或接口方法声明的方法的子类之外,不应在实现方法上声明检查异常。

  • 重写方法时应保持接口方法的签名以及相同的返回类型或子类型。

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

实现Java接口的规则

实现接口时,有几个规则 -

  • 一个类可以同时实现多个接口。

  • 一个类只能扩展一个类,但实现许多接口。

  • 一个接口可以扩展另一个接口,就像一个类可以扩展另一个类一样。

扩展 Java 接口

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

示例:如何扩展Java接口

下面的Sports接口由Hockey和Football接口扩展。

// 文件名: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 中的两个方法。

示例

interface Sports {
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

interface Football extends Sports {
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

interface Hockey extends Sports {
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

public class HockeyDemo implements Hockey {

   public void setHomeTeam(String name) {
      System.out.println("Home team: " + name);
   }

   public void setVisitingTeam(String name) {}

   public void homeGoalScored() {}

   public void visitingGoalScored() {}

   public void endOfPeriod(int period) {}

   public void overtimePeriod(int ot) {}

   public static void main(String[] args) {
      Hockey hockeyDemo = new HockeyDemo();
      hockeyDemo.setHomeTeam("India");
   }
} 

输出

Home team: India 

扩展多个 Java接口

一个Java类只能扩展一个父类。不允许多重继承。然而,接口不是类,一个接口可以扩展多个父接口。

extends 关键字使用一次,父接口在逗号分隔的列表中声明。

例如,如果 Hockey 接口同时扩展了 Sports 和 Event,则将声明为 -

public interface Hockey extends Sports, Event 

示例:如何扩展多个 Java 接口

interface Sports {
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

interface Football extends Sports {
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

interface Hockey extends Sports {
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

interface Event {
   public void organize();
}
public class HockeyDemo implements Hockey, Event {

   public void setHomeTeam(String name) {
      System.out.println("Home team: " + name);
   }

   public void setVisitingTeam(String name) {}

   public void homeGoalScored() {}

   public void visitingGoalScored() {}

   public void endOfPeriod(int period) {}

   public void overtimePeriod(int ot) {}

   public static void main(String[] args) {
      HockeyDemo hockeyDemo = new HockeyDemo();
      hockeyDemo.setHomeTeam("India");
      hockeyDemo.organize();
   }

   public void organize() {
      System.out.println("Match organized. ");
   }
} 

输出

Home team: India
Match organized. 

标记 Java 接口

扩展接口最常见的用法发生在父接口不包含任何方法时。例如,java.awt.event包中的MouseListener接口扩展了java.util.EventListener,其定义为 -

示例

package java.util;
public interface EventListener
{} 

一个没有方法的接口,它是称为标记接口。标记接口有两个基本设计目的 -

创建公共父级 - 与 EventListener 接口一样,它由 Java API 中的数十个其他接口扩展,您可以使用标记接口在一组接口中创建公共父接口。例如,当接口扩展 EventListener 时,JVM 知道该特定接口将在事件委托场景中使用。

向类添加数据类型 - 这情况是术语"标记"的来源。实现标记接口的类不需要定义任何方法(因为该接口没有任何方法),但该类通过多态性成为接口类型。