转载

「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)

「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)

Java面向对象之接口—— interface

什么是接口

一般计算机中的接口分为 硬件接口软件接口

  • 硬件接口 :是指两个硬件设备之间的连接方式,既包括物理上的接口,还包括逻辑上的数据传送协议。
  • 软件接口 :通常是指程序代码,在 Java 中表示一种特殊的类,是具有的N个方法的特征集合,表示一种规范;还有一种情况数据接口,表示客户端和服务端之间的数据交互的方式。

比如,显示器中封装了很多电子元器件,这些元器件连接在一起为显示器的正常共工作提供支持,那么显示器如何与外界的其他设备(如电脑主机、外放音响、耳机等设备)通信交互呢?也是通过显示暴露的通信接口——显示器上暴露的“孔”。通过连接这些“孔”,其他设备就能和显示器一起工作,能够获取显示器中的信息数据,也能够为显示器提供一些显示器不具备的功能,比如:优质的音响效果。

接口的设计目的:从上述的显示器例子中,不难发现,接口可以看作是设备和设备之间的通信桥梁,通过交换数据完成通信。接口表示一种规范/约束/实现者必须遵循的规范,目的就是用来约束使用者应该怎么做。那如果没有这些规范(接口),会出现什么样的问题?

手机的充电器就是接口的实际应用的一个极好的例子。在如今这个智能机泛滥的年代,不知道大家有没有怀念当年功能机和山寨机横行的年代;在那些年代,手机之间的充电设备,各个品牌有各个品牌的“特色”,各个品牌均不一样。

如果充电设备丢了,或者损坏了,往往要花费很大的代价才能才能买到新的,所以在当时的万能充电器才能流行一时,但其充电效果却并不如人意。由此带来的问题极大的困扰了广大手机用户。

「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)

直到Android系统的出现,统一了充电接口规范后,这个问题才得到了有效解决。因为安卓系统统一了手机充电接口规范,所以几乎所有的Android手机的充电接口是相同的( Micro-USB/Type-c/Lightning )。当然了,苹果手机是个特立独行的大佬,不在讨论的范围之内。

USB接口

生活中, USB接口 和我们经常接说的 USB插槽 其实是有所偏差的,其并不是我们平时所看到的那些 USB 插槽,而是那些USB插槽所遵循的一种规范(标准)。 USB 的英文是 Universal Serial Bus (通用串行总线),用于规范电脑与外部设备的连接和通讯,广泛应用于 PC 领域的接口技术。

我们所看到的那些 USB 插槽是根据 USB 接口规范设计出来的产品,对于不同型号的 USB 设备而言,他们各自的 USB 插槽都需要遵循同一个规范,如此可以保证任何插入 USB 插槽的设备都能与主板正常通信。

「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)

对于同一种型号的主板上的多个 USB 插槽,他们有相同的数据交换方式,相同的实现细节;在面向对象的思想中,可认为他们都是同一个类的不同实例,也就是说 USB 插槽是 USB 规范的实例。

接口只定义了应当遵循的规范,却并不关心这些规范的内部数据和其功能的实现细节,从而分离了规范和实现,增强了系统的可拓展性和可维护性。这样做的好处:比如,主板上提供了 USB 插槽,只要一个遵循了 USB 规范的鼠标,就可以插入 USB 插槽,并与主板正常通信,而不必关心至于这个鼠标的厂商,鼠标内部实现。当鼠标坏了的时候,只需要换个鼠标就行。

Java中的接口

Java中的接口,书面解释是多个抽象类的抽象就是接口;通俗点说,在 Java 中最小的程序单元是类,而接口其实是一个特殊的类。和 USB 接口一样, Java 中的接口也表示规范,用于定义一组抽象方法,表示某一类事物必须具备的功能,接口的实现类来实现该接口并提供接口中每个方法的实现。

定义类语法: 权限修饰符 class 类名{}
定义接口语法: 权限修饰符 interface 接口名{} 

接口的命名:

  1. 表示具有某些能力的,可以以 able/handler 结尾。如: Walkable.java
  2. 以I开头表示接口,如: IWalkable.java

接口在编译成功之后,和类一样,也是 .class 的字节码文件。

接口中的成员:

1.接口中没有构造器,因为接口不能使用 new 关键字创建对象(不能 new );

2.接口中不能定义普通方法,接口中的方法都是默认为公共的抽象方法,而且都是 public abstract 修饰的;所以接口中的方法的 public 符 和 abstract 修饰符是可以省略不写的;

3.接口中定义的成员变量,实质是全局静态常量,默认使用 public static final来修饰;

  • public static final String NAME = "老夫不正经";

4.接口中定义的内部类都是公共的静态内部类,默认使用public static来修饰内部类.

  • public static interface Openable {}

标志接口:没有任何成员,仅仅提供一个接口定义的接口,其就只是一个标志,若有类实现该接口,则该类就属于接口这一派系。这个使用的不多,了解就好。

常量接口:使用接口来封装多个常量信息,称之为常量接口,其目的和普通常量类相同,但在这里不建议使用。

接口的特点:

public abstract
public static final
public static

接口的继承:

接口只能继承接口,不能继承类,且接口支持多继承(类是单继承关系)。接口继承语法如下:

  • [修饰符] interface 接口名 extends 接口1,接口2

类和类之间的继承关系用 extends 关键字来表示,接口和接口之间也只能是继承关系,也使用 extends 关键字来表示。

接口和实现类之间只能是实现关系,而且是类实现接口,用implements关键字来表示。

「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)

接口的实现

接口仅仅只是定义了某一类事物应该具有某些功能,但是没有提供任何实现。但在 Java 8 以及以后的版本中,接口是可以有默认实现的。此时,我们定义了一个类,再用该类去实现接口,那么就必须覆盖接口中的方法,提供功能实现,从而实现类接口中定义的功能。

类实现接口: 一个类可以实现多个接口 ,从而也弥补了类的单继承问题。语法如下:

  • [修饰符] class 实现类名 extends 父类 implements 接口1,接口2{}

接口和实现类之间的关系,称之为"实现关系",使用 implements 关键字来表示,但有时候为了方便,也把这个实现关系称之为特殊继承关系。可以这样理解:接口是实现类的父类:实现类就是接口的子类。

面向接口编程

接口和实现类的多态关系是在开发中比较常见的多态体现

  • 接口 变量 = 创建实现类对象;//体现了多态思想

接口中的方法是公共的抽象的,所以实现类必须覆盖接口中的方法,并且方法必须使用 public 修饰,因为接口中的方法默认就是使用 public 修饰的。

接口和抽象类的相同点:

  1. 都位于继承的顶端,用于被其他类或者接口实现或继承;
  2. 都不能被实例化;
  3. 都可以定义抽象方法,其子类/实现类都必须覆写这些抽象方法;

接口和抽象类的不同点:

Java 8
Java
public static final
public abstract
public static

如果接口和抽象类可以完成相同的功能,尽量使用接口,这就是 面向接口编程 。面向接口编程在于使用多态的好处,把实现类对象赋给接口类型变量,屏蔽了不同实现类之间的实现差异,从而可以做到通用编程。

案例:使用USB设备来工作。

「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)

「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)

「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)

完结。老夫虽不正经,但老夫一身的才华

原文  https://segmentfault.com/a/1190000022386820
正文到此结束
Loading...