接口的基本定义
抽象类与普通类的最大优势在于:可以实现对子类覆写方法的控制,但是在抽象类里面也会有普通方法,而普通方法里面可能会涉及到一些安全或者隐私的操作问题。那么这样在进行开发的过程当中,如果想对外部隐藏全部的开发细节,则就可以通过接口来进行描述。
接口可以理解为一个纯粹的抽象类(最原始的定义接口之中只包含抽象方法与全局常量的), 但是从1.8开始,由于引入了Lambda表达式的概念,接口的定义也得到了加强,除了抽象方法与全局常量之外,还可以定义普通方法或静态方法。如果从设计本身的角度来讲,接口之后的组成还是应该以抽象方法和全局常量为主。
在java中接口主要使用interface关键字来定义。
定义一个接口
但是明显的问题出现了,此时的接口可你当是无法直接产生实例化对象,所以对于接口的使用:
接口需要被子类实现(implements ),一个子类可以实现多个父接口;
子类(如果不是抽象类)那么一定要覆写接口之中的全部抽象方法。
接口对象可以利用子类对象的向上转型进行实例化。
定义接口子类
子类实现多个父接口
注意:此时MessageImpl子类的对象可以任意的实现父接口的转换。
观察转换:
注意: 由于MessageImpl子类实现了IMessage与IChannel两个接口,所以这个儿子类可以是这两个接口任意一个接口的实例, 那么就表示这两个接口实例之间是可以相互转换的。
在java程序里面接口是不允许继承父类的, 所以接口绝对不会是Object的子类,但是MessageImpl是Object的子类,所以接口一定可以通过Object接收。
观察: Object与接口的转换:
注意: 接口中的方法默认是public 写与不写是一样的,建议写,方法上的abstract 写不写也是一样的,可以不写。
子类继承抽象类并且实现接口
实现接口的多继承
口定义加强
接口的主要特点是全部由抽象方法,全局常量组成。但是如果项目设计不当,则会出现严重的问题。比如后期给接口新增加了一个方法,则所有实现的子类都需要覆写新增加的方法。
为了方便子类的修改,往往不会让子类直接实现接口,而是中间追加一个过渡的抽象类。
但是版本1.8之后,为了解决接口设计的缺陷,所以在接口之中允许开发者定义普通方法。
范例:观察接口中的普通方法定义:
接口中的普通方法必须追加default的声明, 但是这个是补就的方法,平常不建议使用。除了可以追加普通方法之外, 接口里面也可以定义static方法了,而static方法就可以通过接口会直接调用static方法。
工厂设计模式
对于接口而言,已经清楚其必须有子类,并且子类可以通过对象向上转型来获取接口的实例化对象,但是在进行对象实例化的过程当中,也可能存在设计问题。
范例:
代理设计模式
代理设计模式的主要功能是可以帮助用户将所有的开发注意力只集中在核心业务功能上。
抽象类与接口的区别
No | 区别 | 抽象类 | 接口 |
---|
1 | 定义 | abstract class 抽象类名称{} | interface 接口名称{} |
2 | 组成 | 构造,普通方法,静态方法,全局常量,普通成员,static方法 | 抽象方法,全局常量,普通方法,static方法 |
3 | 权限 | 可以使用各种权限定义 | 只能使用public |
4 | 子类使用 | 子类通过extends关键字可以成一个抽象类 | 子类使用implements 可以实现多个接口 |
5 | 两者关系 | 抽象类可以实现若干个接口 | 接口不允许继承抽象类,但是允许继承多个父接口 |
6 | 使用 | 1. 抽象类或接口必须定义子类 2. 子类一定 要覆写抽象类或接口中的全部抽象方法 3. 通过子类向上转型实现抽象类或接口对象实例化 | |