Java - 接口


接口是Java中的引用类型。这与课堂类似。它是抽象方法的集合。类实现了接口,从而继承了接口的抽象方法。

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

编写接口与编写类类似。但类描述了对象的属性和Behave。接口包含类实现的Behave。

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

接口在以下方面与类相似 -

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

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

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

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

然而,接口在几个方面与类不同,包括 -

  • 您无法实例化接口。

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

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

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

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

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

声明接口

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关键字。

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

  • 接口中的方法是隐式公共的。

例子

/* File name : Animal.java */
interface Animal {
   public void eat();
   public void travel();
}

实现接口

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

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

例子

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

输出

Mammal eats
Mammal travels

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

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

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

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

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

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

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

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

扩展接口

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

以下 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 中的两个方法。

例子

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类只能继承一个父类。不允许多重继承。然而,接口不是类,一个接口可以扩展多个父接口。

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

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

例子

public interface Hockey extends Sports, Event

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.awt.event 包中的 MouseListener 接口扩展了 java.util.EventListener,其定义为 -

例子

package java.util;
public interface EventListener
{}

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

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

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