JAVA接口的本质是什么?应该如何使用接口才是正确的使用方式,这个有点搞不明白。希望有大神帮忙解答一下。
接口跟类一样,是一种引用数据类型。
正确的使用,很简单,掌握好定义、实现即可。
定义比较麻烦,需要有面向对象的思想。
实现是固定的,用implements关键字实现。可以实现多个接口。
使用接口的所要最终目的就是松耦合,程序猿会使用各种方法来达到松耦合的目的。接口可以让你得代码之间的依赖尽可能的小,
依赖小也就是代码之间的影响尽可能小。
关于接口的使用,有一个原则叫:接口隔离原则(Interface Segregation Principle)
接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
说到这里,很多人会觉的接口隔离原则跟单一职责原则很相似,其实不然。其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。
采用接口隔离原则对接口进行约束时,要注意以下几点:
1. 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
2. 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
3. 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些时间去思考和筹划,才能准确地实践这一原则。
接口的使用:
1、接口用interface关键字修饰,接口变量可以被赋值为任何实现该接口的类的对象
2、接口中至少包含一个抽象方法,java8中允许接口中包含default修饰的非抽象方法
3、接口中不可以定义静态方法
4、接口中只能定义静态常量属性,常量默认都有public static final修饰
5、接口不包含构造方法
6、接口中不包含初始化块
接口的本质:
体现的是一种规范。对接口的实现者而言,接口规定了实现者必须向外提供哪些服务;对接口的调用者来说,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。
当一个程序中使用接口时,接口是多个模块间的耦合标准;当在多个应用程序之间使用接口时,接口是多个程序间的通信标准。
上面的回答都很精彩,其实说白了,接口就是定义一组规范,让实现他的类去按照这种规范去实现即可
个人认为接口可以看做一个特殊的类,在使用实现时,可以类比继承,很多知识都是通用的,初学java,不对的还请各位大神指正
接口主要是用来进行定义一些规范和协议,让实现它的类符合规范。
接口对程序具有扩展性。
从应用上举例说明:如果要创建一个线程任务必须继承Thread类,重写run方法;如果该类已有自己的体系(父类),不能继承Thread类,那么可以实现Runnable接口,实现run方法的方式创建线程。再比如Serializable接口的使用,它是一个空接口,但是实现了该接口的类会被标识为可序列化的;诸如此类的例子很多,接口作为程序的必不可少的一种扩展的方式存在。
接口封装了细节,调用层不再关心实现逻辑。
还是Thread类的例子,在Thread类中有一个属性是Runnable target(接口属性),run方法的实现判断如果target不为空则调用target.run,在这里target.run的实现是由实现了Runnable的人封装的业务逻辑。
这段实现代码要注意的点在于在Thread类中,如果target不为空永远是调用接口.run方法,run方法的内部实现与它无关。换个角度想,如果你的应用需要某个业务,是不是可以做到调用层代码不需要变化,如果可以,那么系统的长期维护和需求变更变得更加简单。
接口还有很多其他优点,比如定义了规范、形成了体系、减少了依赖、降低了耦合等等。。这些行为和作用的理解是在长期编码中体会出来的,按照定义很难理解它的妙用,经常看代码、写代码时间长了自然就能有自己的心得了。
接口是从多个相似类中抽象出来的规范,接口不提供任何实现。接口体现的是规范和实现分离的设计哲学。
[修饰符] interface 接口名 extends 父接口1,父接口2... { 零到多个常量定义... 零到多个抽象方法定义... 零到多个内部类、内部接口、内部枚举定义... 零到多个默认方法或类方法定义(Java8)... } 修饰符可以是public或者省略
接口中可以包含的成员(接口中不能包括静态方法和初始化块):
方法(只能是抽象实例方法、类方法或默认方法):
普通方法使用 public abstract修饰,且不能有方法体;
默认方法必须有方法体,必须用default修饰,不能用static修饰;系统还会为默认方法指定public修饰符;需要用接口实现类的实例调用
类方法必须有方法体,必须用static修饰;系统还会为默认方法指定public修饰符;可直接使用接口来调用
内部类(包括内部接口和枚举) 默认使用public static修饰
多继承
接口的主要用途:
1. 定义变量,也可用于强制类型转换
2. 调用接口中定义的常量
3. 被其他类实现
一个类可以继承一个父类,并同时实现多个接口,implements必须放在extends后面
一个类最多只能有一个直接父类,包括抽象类;但一个类可以实现多个接口
接口不能显示继承任何类,但所有接口类型的引用变量都可直接赋给Object类型的引用变量,这是利用向上转型实现的