Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类参考

Java 有用资源

Java - 接口



Java 接口

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

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

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

Java 接口和类:异同

相似之处

接口在以下方面类似于类 -

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

  • 接口以.java扩展名写入文件,接口名称与文件名匹配。

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

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

区别

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

  • 您不能实例化接口。

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

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

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

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

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

在 Java 中声明接口

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

声明 Java 接口的示例

以下是一个接口示例 -

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

Java 接口的属性

接口具有以下属性 -

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

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

  • 接口中的方法隐式为 public。

示例

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

在 Java 中实现接口

当一个类实现一个接口时,您可以将该类视为签署了一份合同,同意执行接口的特定行为。如果一个类没有执行接口的所有行为,则该类必须将自身声明为抽象类。

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

示例:在 Java 中实现接口

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

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

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

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

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

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

实现 Java 接口的规则

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

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

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

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

扩展 Java 接口

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

示例:如何扩展 Java 接口

以下 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 接口

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 知道这个特定接口将用于事件委托场景。

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

广告