Java面向对象之接口——interface

什么是接口

一般计算机中的接口分为硬件接口和软件接口。硬件接口:是指两个硬件设备之间的连接方式,既包括物理上的接口,还包括逻辑上的数据传送协议。

软件接口:通常是指程序代码,在Java中表示一种特殊的类,是具有的N个方法的特征集合,表示一种规范;还有一种情况数据接口,表示客户端和服务端之间的数据交互的方式。

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

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

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

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

各有特色的功能机充电器

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

USB接口

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

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

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

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

Java中的接口

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

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

接口的命名:表示具有某些能力的,可以以able/handler结尾。如: Walkable.java

以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 8以及以后的版本中,接口是可以有默认实现的。此时,我们定义了一个类,再用该类去实现接口,那么就必须覆盖接口中的方法,提供功能实现,从而实现类接口中定义的功能。

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

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

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

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

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

面向接口编程

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

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

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

接口和抽象类的相同点:都位于继承的顶端,用于被其他类或者接口实现或继承;

都不能被实例化;

都可以定义抽象方法,其子类/实现类都必须覆写这些抽象方法;

接口和抽象类的不同点:接口没有构造方法,抽象类有构造方法;

抽象类可包含普通方法和抽象方法,接口只能包含抽象方法(Java 8之前);

类是单继承的,一个类只能继承一个直接父类(可能是抽象类),接口是支持多继承的;一个可以类实现多个接口(接口弥补了Java的单继承);

成员变量:接口里默认是public static final,抽象类是默认包权限;

方法:接口里默认是public abstract,抽象类默认是默认包访问权限;

内部类:接口里默认是public static,抽象类默认是默认包访问权限;

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

案例:使用USB设备来工作。IUSB.javaMotherBoard.java

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

java借口不同程序_「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)...相关推荐

  1. java数据类型入门程序_「JAVA零基础入门系列」Day3 Java基本数据类型

    前两篇已经将开发环境搭建完成,如果你已经按之前的教程按部就班的完成了部署,那么世界上最优秀的编程语言之一和世界上最优秀的IDE之一已经出现在你的电脑上(此处应有掌声),如果你还没入门,或者正在台阶上踱 ...

  2. java 线程间通信方式_「转」JAVA多线程之线程间的通信方式

    1. 同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public class MyObject { synchronized public void m ...

  3. java代码规范插件_「Java基础知识」代码规范插件怎么用

    原标题:「Java基础知识」代码规范插件怎么用 在开发中,好的编程风格可以提升团队合作能力,提升开发的效率,但是每个人都有自己的编程习惯,如何能够将大家的编程风格统一,这个在团队中也很重要; 在Jav ...

  4. java tcp权限控制_「图解」TCP重传、滑动窗口、流量控制、拥塞控制

    前言 前一篇35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题得到了很多读者的认可,在此特别感谢你们的认可,大家都暖暖的. 来了,今天又来图解 TCP 了,小林可能会迟到,但不会缺席. 迟到的 ...

  5. docker 容器运行 golang程序_「Docker」 - 运行 amp; 管理容器

    容器是基于容器技术所建立和运行的轻量级应用运行环境,它是Docker封装和管理应用程序或微服务的「集装箱」,在Docker中,容器是最核心的部分. 一.容器的创建和启动 Docker容器的生命周期里分 ...

  6. 在JAVA中 以下程序_在Java中,以下程序的输出结果是()_学小易找答案

    [单选题]运行以下Java代码,说法正确的是( ). [单选题]在Java中,以下程序的输出结果是() [单选题]利用"出声"的方式向学生展示教师分析问题的过程与方法的教学方法是_ ...

  7. java编写应用程序_使用Java API编写应用程序

    java编写应用程序 总览 介绍 DB2JSON可用于DB2 Linux,Unix和Windows 10.5以及用于z / OS V3.1的IBM DB2 Accessories Suite与DB2 ...

  8. java function获取参数_「Java容器」ArrayList源码,大厂面试必问

    ArrayList简介 ArrayList核心源码 ArrayList源码分析 System.arraycopy()和Arrays.copyOf()方法 两者联系与区别 ArrayList核心扩容技术 ...

  9. java类初始化顺序_「漫画」Java中的父子类的执行顺序到底是怎么一回事?

    ----下课后---- 结论 类的加载顺序. (1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法) (2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 ) (3) ...

最新文章

  1. 十、散列表(Hash Table)
  2. 爬虫开发10.scrapy框架之日志等级和请求传参
  3. 计算机共享原理,synchronize底层原理 游戏电脑问题解决分享!
  4. H5常用拖放事件解析
  5. Jdk 和 jre 的 关系和区别
  6. 图解读写锁:pthead_rwlock_t
  7. elsevier模板_英文论文双栏模板
  8. vue多html标签,Vue实现多标签选择器
  9. 请求的资源不可用html,“HTTP状态404请求的资源不可用”
  10. 大学计算机模拟2014网络应用,2014全校大学计算机基础模拟考试.doc
  11. 虚拟内存与物理内存与内存碎片-杂谈
  12. 中文汉化AE插件-图层边界自动填充生长动画插件
  13. waiting for headers
  14. webim--web端即时通讯的实现
  15. 2017年最好用的9个php开发工具推荐(超好用)
  16. android突然断电丢失程序,a2sd+状态下应用程序丢失的解决方法详细解析
  17. 手机录音m4a怎么转换成mp3
  18. Activity详解Activity的使用步骤、生命周期及其启动模式、启动方法
  19. oracle表空间不足影响,Oracle 表空间不足引起的问题及解决方法
  20. 零基础学浙大翁恺C语言(4):进一步的判断与循环

热门文章

  1. 容器技术在企业落地的最佳实践
  2. 时间分割算法,Java将一段时间按星期来分割
  3. mini Vue的实现 Vue工作原理简析
  4. 心流:最优体验心理学-米哈里·契克森米哈赖
  5. 使用Java统计英文文章的单词频率。
  6. 现在爆火的数字孪生城市,到底是什么技术?
  7. uniapp+egg.js获取微信步数(wx.getWeRunData)
  8. Windows、Linux下安装Maven图文教程
  9. IT实习生需要做什么?IT实习心得
  10. 单应性矩阵的理解及求解3