# 接口
- 接口(interface)可以看成是特殊的抽象类,只包含抽象方法的抽象类,所谓 interface 就是比抽象类还要抽象的接口
- 在抽象类中,抽象方法本质上是定义接口规范,即规定高层类的接口,从而保证所有子类都有相同的接口实现,同样接口也可以理解为一个操作规范,
- 接口与继承不同,类通过 implements 来实现接口也可以实现多个接口,用逗号隔开,同时该类要实现这些接口中定义的方法也就是重写
- 接口之间可以继承,用 extends 关键字,接口可以继承多个接口,用逗号隔开
- 接口也可以作为类型声明变量
- 不能实例化对象
- 建议面向接口编程
备注:
- 接口里只能定义抽象方法
- 接口通过 implements 实现接口,并且可以实现多个接口逗号隔开
- 实现接口后必需重写抽象方法(也就是接口中的方法)
# 接口定义与实现
- Java接口定义的语法:
[修饰符] interface 接口名 {
接口中的字段默认使用 public static final修饰
接口中的方法默认使用 public abstract 修饰
接口中可以定义 public static 静态方法
定义 public default方法
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- Java接口的使用 通过 implements 实现接口,同时,要重写接口中方法,多个接口用逗号隔开
[修饰符] class 类名 implements 接口1,接口2{
//重写接口中的方法
}
1
2
3
4
5
6
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
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
2
3
4
5
可以省略 public abstract:
package com.qym.xmm.day23;
interface Person {
void run();
void eat();
}
1
2
3
4
5
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方法 |