# 接口

  • 接口(interface)可以看成是特殊的抽象类,只包含抽象方法的抽象类,所谓 interface 就是比抽象类还要抽象的接口
  • 在抽象类中,抽象方法本质上是定义接口规范,即规定高层类的接口,从而保证所有子类都有相同的接口实现,同样接口也可以理解为一个操作规范,
  • 接口与继承不同,类通过 implements 来实现接口也可以实现多个接口,用逗号隔开,同时该类要实现这些接口中定义的方法也就是重写
  • 接口之间可以继承,用 extends 关键字,接口可以继承多个接口,用逗号隔开
  • 接口也可以作为类型声明变量
  • 不能实例化对象
  • 建议面向接口编程

备注:

  1. 接口里只能定义抽象方法
  2. 接口通过 implements 实现接口,并且可以实现多个接口逗号隔开
  3. 实现接口后必需重写抽象方法(也就是接口中的方法)

# 接口定义与实现

  1. Java接口定义的语法:
[修饰符]   interface  接口名 {
    接口中的字段默认使用 public static final修饰
    接口中的方法默认使用 public abstract 修饰
    接口中可以定义 public static 静态方法
    定义 public  default方法
}

1
2
3
4
5
6
7
  1. Java接口的使用 通过 implements 实现接口,同时,要重写接口中方法,多个接口用逗号隔开
[修饰符]  class  类名  implements  接口1,接口2{

    //重写接口中的方法

}

1
2
3
4
5
6

如果一个抽象类没有'字段',所有方法全部都是抽象方法:

package com.qym.xmm.day23;

public abstract class Person {
    public abstract void run();
    public abstract void eat();
}
1
2
3
4
5
6

就可以把该抽象类改写为接口:

package com.qym.xmm.day23;
public abstract interface Person {
    public abstract void run();
    public abstract void eat();
}
1
2
3
4
5

可以省略 public abstract:

package com.qym.xmm.day23;
interface Person {
    void run();
    void eat();
}
1
2
3
4
5

# 抽象类和接口区别

相同点:

  • 都可以定义抽象方法
  • 都不能实例化对象
  • 抽象类/接口的抽象方法都需要被重写
  • 抽象类/接口中都可以定义 public static final字段, public static静态方法

不同点:

  • 意义不同
    • 抽象类对类进行更高层级的抽象
    • 接口是对功能的封装
  • 定义方式不同
    • 抽象类使用 abstract class定义
    • 接口使用 interface 定义
  • 内容不同
    • 抽象类中除了可以定义抽象方法外, 还可以定义实例变量/实例方法/静态变量/静态方法,构造方法等普通类所有的成员
    • 接口中除了抽象方法外, 还可以定义public static final字段, public static方法,public default方法
    • 抽象类有构造方法, 接口没有构造方法; 接口中可以使用default修饰方法,抽象类不能使用default修饰方法
  • 使用方式不同
    • 抽象类一般作为父类存在, 需要子类通过 extends 继承
    • 接口需要通过类 implements 实现
  • 继承
    • 抽象类只支持单继承,
    • 接口支持多继承
  • 应用场景不同
    • 如果除了功能外,还需要保存不同的数据,选择抽象类, 抽象类中的抽象方法,需要在子类中重写, 抽象类可以约束所有的子类都具有某个功能
    • 如果仅仅是为了扩展类的功能,优先选择接口
abstract class interface
继承 只能extends一个class 可以implements多个interface
字段 可以定义实例字段 不能定义实例字段
抽象方法 可以定义抽象方法 可以定义抽象方法
非抽象方法 可以定义非抽象方法 可以定义default方法