接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

一、接口的定义

接口定义的一般形式如下:

  1. [访问权限修饰符] interface 接口名 (extends 父接口1,父接口2,...]{
  2. //定义成员变量
  3. [public][static][final]数据类型 变量名 = 初始值;
  4. ...
  5. //定义成员方法
  6. [public][abstract]返回类型 方法名([参数列表);
  7. }
  • 上面的定义中, interface表明这是一个接口,访问权限修饰符和类使用的一样,默认访问权是包访问权,一般用public来修饰它。和类有区别的是,接口都是抽象的,所以无须用abstract来修饰
  • extends和类中的一样,表明后面的列表是它的父接口。这里的父接口可以有若干多个,各个接口名之间用逗号隔开。接口的继承和类的继承基本原则是一样的。(其实更简单)
  • 接口中的成员属性都是常量。在默认情况下,接口中的成员变量具有“ public static final”所联合规定的属性,这3个修饰符中,static和final没有替代的关键字,这意味所有的成员属性都是静态的、最终的,也就是静态常量。唯一可能改变的是访问权限修饰符public,但在接口中,不允许使用 protected和private关键字,这意味着所有的属性都是public类型的。
  • 接口中的成员方法都是抽象方法。在默认情况下,接口中的成员方法具有“ public abstract”所联合规定的属性。同样 public在这里不可改变,abstract没有可以替代的关键字,又由于abstract和static不可联合使用,所以不可能是静态方法,故所有的方法都是具有public访问权限的抽象实例方法
  • 接口中的方法都是抽象的,而构造方法不可能为抽象方法,接口中自然就没有构造方法

二、接口的特性

1.接口特点:

  • 接口用关键字interface表示—- interface 接口名 {}
  • 类实现接口用implements表示—- class 类名 implements 接口名 {}
  • 接口不能实例化
    那么,接口如何实例化呢? 按照多态的方式来实例化
  • 接口的子类
    a:可以是抽象类。但是意义不大。
    b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)

2.接口成员特点:

  • 成员变量;只能是常量,并且是静态的并公共的。
    默认修饰符:public static final
    建议:自己手动给出。
  • 构造方法:接口没有构造方法。
  • 成员方法:只能是抽象方法。
    默认修饰符:public abstract
    建议:自己手动给出。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错);接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)

三、接口和抽象类的区别

  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

四、接口的实现

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

  1. ...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

实例

  1. class Demo_Interface {
  2. public static void main(String[] args) {
  3. Demo d = new Demo();
  4. d.print();
  5. }
  6. }
  7. interface Inter {
  8. public static final int num = 10;
  9. public abstract void print();
  10. }
  11. class Demo /*extends Object*/ implements Inter { //一个类不写继承任何类,默认继承Object类
  12. public void print() {
  13. System.out.println(num);
  14. }
  15. }

以上实例编译运行结果如下:

  1. 10

重写接口中声明的方法时,需要注意以下规则:

  • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
  • 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
  • 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

在实现接口的时候,也要注意一些规则:

  • 一个类可以同时实现多个接口。
  • 一个类只能继承一个类,但是能实现多个接口。
  • 一个接口能继承另一个接口,这和类之间的继承比较相似。

五、接口的继承

1.接口的单继承
一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。

  1. // 文件名: Sports.java
  2. public interface Sports
  3. {
  4. public void setHomeTeam(String name);
  5. public void setVisitingTeam(String name);
  6. }
  7. // 文件名: Football.java
  8. public interface Football extends Sports
  9. {
  10. public void homeTeamScored(int points);
  11. public void visitingTeamScored(int points);
  12. public void endOfQuarter(int quarter);
  13. }
  14. // 文件名: Hockey.java
  15. public interface Hockey extends Sports
  16. {
  17. public void homeGoalScored();
  18. public void visitingGoalScored();
  19. public void endOfPeriod(int period);
  20. public void overtimePeriod(int ot);
  21. }

2.接口的多继承
在Java中,类的多继承是不合法,但接口允许多继承。
在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:

  1. public interface Hockey extends Sports, Event

文章参考—-菜鸟教程Java接口教程:https://www.runoob.com/java/java-interfaces.html