18.1.基本介绍
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。
18.2.语法
(public 或者 默认) interface 接口名 {
属性
方法
}
1.在 jdk7.0 前,接口里的所有方法都没有方法体,即都是抽象方法
2.在 jdk8.0 后,接口可以有静态方法,默认方法,也就是接口中可以有方法的具体实现
class 类名 implements 接口 {
自己属性;
自己方法;
必须实现的接口的抽象方法
}
18.3.接口的注意事项和细节
- 接口不能被实例化
- 接口中所有的方法是 public 方法,接口中抽象方法,可以不用 abstract 修饰
例子:void cry();
实际上是public abstract void cry();
- 一个普通类实现接口,就必须将该接口的所有方法都实现
- 抽象类实现接口,可以不用实现接口的方法
- 一个类同时可以实现多个接口
- 接口中的属性,只能是 final,而且是
public static final 修饰符
。
例子:int a = 1;
实际上是public static final int a = 1;
(必须初始化) - 接口中属性的访问形式:接口名 . 属性名
- 接口不能继承其它的类,但是可以继承多个别的接口
例子:interface A extends B,C {}
- 接口的修饰符,只能是 public 和默认,这点和类的修饰符是一样的
18.4.实现接口与继承类的比较
- 接口和继承解决的问题不同
继承的价值主要在于:解决代码的复用性和可维护性
接口的价值主要在于:设计,设计好各种规范(方法),让其它类去实现这些方法 - 接口比继承更加灵活
继承是满足 is - a 的关系,而接口只需满足 like - a 的关系 - 接口在一定程度上实现代码解耦 [即:接口规范性 + 动态绑定机制]
18.5.接口与抽象类的比较
抽象类 abstract | 接口 interface | |
---|---|---|
定义 | 不能实例化对象的类。通过abstract class来定义抽象类。抽象类必须被继承,才能被使用。一个类通过extends关键字来继承抽象类。 | 接口不是类,是抽象方法的集合。通过Interface来声明接口。一个类通过implements关键字来实现接口中的抽象方法。 |
作用 | is-a关系 是什么 | like-a 能做什么 |
描述 | 描述对象的属性和方法,关注的是事物本身的抽象 | 声明类要实现的方法,关注的是操作行为的规范 |
成员方法 | 抽象类的方法有方法体,可以实现方法的具体功能 | 接口中只有方法的声明,没有方法体(接口中的方法默认public abstract类型) |
成员变量 | 抽象类的成员变量可以是各种类型 | 接口中成员变量只能是public static final类型(公共静态常量,必须初始化) |
static修饰符 | 抽象类可以有静态代码块和静态方法 | 接口中没有静态代码块,静态方法看JDK版本 |
继承关系 | 一个类只能继承一个抽象类 | 一个类可以实现多个接口,接口可以继承多个别的接口 |
优缺点 | 优点:实现公共特性的提取,使具体类可以从抽象类自动得到缺省实现,复用性强,简化代码 缺点:单继承,使子类的功能的扩展性大打折扣 | 优点:一个类可以实现多个接口,接口可以使这个类不仅具有主类型的行为,而且具有其他的次要行为,比如 HashMap主要类型是Map,而Cloneable接口使它具有一个次要类型,这个类型说明它可以安全的克隆 |
使用建议 | 用于给子类提供一个抽象的描述,用作主要类型的说明 | 用于给子类提供多个功能的补充,用作次要类型的说明 |
相同点:均不可实例化,均需要子类 继承/实现 对应的抽象方法