为什么写这篇文章

今天有人问了我这样一个问题

Java中为什么要使用接口呢?

还要先定义了一个接口,类还要实现接口的方法,还不如直接在这个类中写实现方法呢,根本没必要定义接口啊。

大概就是这样一个问题。

这个问题不止困扰很多初学者,有的2年工作经验都不太理解,接口到底是个什么东西。

这里根据本人对接口的理解,简单谈谈如何理解接口,如有错误,请指正。

接口是什么

接口首先是个规范(也可以叫协议,觉得怎么理解方便怎么理解就好)

先举个生活中的例子

某天你去上海去旅游,做了半天的车,下车后有点饿,想吃点东西,找了一个上海菜的饭店。进去准备吃东西。

这里的菜单就是一个特别形象的接口。

看菜单我就知道这家店卖红烧肉,生煎包, 手撕鸡, 清蒸大闸蟹、蟹粉小笼、蟹粉豆腐,八宝鸭等等菜品。然后我就可以直接点点餐, 来个红烧肉,生煎包,来个XX汤。搞定。

楼主是东北人,如果没有菜单,我进去可能会问有没有小鸡炖蘑菇、猪肉炖粉条。然后告诉我都没有。这样一个一个的问非常麻烦,而且还未必知道点什么。那我就要问你这都有什么啊,服务员跟我balabala一堆,我还没记住都有什么,这点餐是不是特别麻烦呢,有了菜单简单多了。这里的菜单就可以理解为一个接口。顾客就是接口的调用者,厨房就是接口的实现类,会根据接口提供的方法,提供各种菜品。

上面的例子代表了接口一个重要作用,接口首先是个规范。这个规范很方便调用者去使用。就是上面的顾客,顾客不需要知道你是怎么做的红烧肉,只需要知道你有红烧肉就够了。这个情况下就非常适合使用接口了。

总结:接口是为2个不同类之间连接定义的标准。上面的顾客和厨房,直接用菜单连接起来。

职责的分离

还是拿生活中最常见的东西举例子。

这个是插排

插排, 应该是家里都有的东西了,插排的插孔一般有2个的也有三个的。现在很多插排还提供了USB口。这里我们可以把2口的插孔,三口的插孔。还有USB口的插孔理解位三个不同的接口。个接口定义了插排孔的大小,和距离。有这样的接口,我才能通过接口或者说是规范去生产插排,然后才能提供给你使用。如果我提供的接口比较小你手机的充电头插不进去,那么我生产了是不是没有意义呢。我生产的插排是为了给用户使用的,而使用插排的就是插排的调用者,就是一个个具体的插头,如果用户的插头是USB的那普通的插排就无法使用。这时候用户就需要找到一个实现了USB接口的插排。而用户却不用关心你是如何实现的,也不需要考虑你生产的是什么样子,只要你按接口实现就可以了。上图给了不同类型的插排,虽然样子各异,功能也不完全一样,但是他们都实现了具体的接口。

通过上面的例子,我们定义了三个不同的接口,每个接口有不同的具体实现。但是具体实现是谁作为调用者完全不关系,是公牛插排也好,小米插排也好,或者是飞利浦也无所谓。这就出现了接口的一个重要思想,接口和实现分离的思想。这个思想的一个最直接的好处就是,代码的解耦。插头的制造过程不考虑插排的具体实现,而只是按照标准接口实现就可以。而插排的制造也不需要具体的插头。根本不需要考虑是谁去使用,不管是手机用电脑用,电视用或者别的东西。我只要按标准生产我的就行了。这样分工就非常明确了。减少了耦合度。使插排的制造和插头的制造都变得更加容易。而且更加的具有适应性。

结尾

本来还有一些东西需要写一下。暂时先总结一下,以后补充上。

第一接口可以理解位一个规范。这个规范规定了一个类的部分行为,而不是全部行为。

比如上面的例子我们有三个接口。有的插排只实现了其中的两个,而没有USB接口。那么不需要USB接口的调用者,比如电视机就可以使用这个插排。

接口可以隔离实现,对于接口的调用者,不需要考虑他调用哪个具体实现类,如果没有接口,那么电视可能就是位固定的插排生产的,这样做一般也没什么,只要插排没有问题,电视还是可以用的,但是有一天插排出了问题,你需要换个插排的时候。因为没有固定的接口,那么其他人生产的插排可能完全用不了。

如果两个类都是按同一个标准实现了一个同名的方法,那么是不是也可以呢,理论个别情况可以,但是这里就出现另一个问题,就是如果他们只是方法名相同,但是没有实现同一个接口,那么对于调用者来说,他需要非常明白两个类的这个方法都是具体做什么才可以这样用,如果使用接口,调用者就不需要考虑这个问题,而直接调用接口的这个方法就行了。

还有一个重点要说的地方。就是接口有一个好处就是实现了,接口和实现的分离,如果不理解这句话,用另外一个意思理解,定义和实现相分离,接口只是对某一类东西的定义,而具体实现就是具体的类,分离有一个好处就是,可以更好的隐藏实现。很多时候实现是不希望被调用者看到具体的实现细节的。而只是位调用者提供几个方法,这个时候接口就特别有用了。

比如上面吃饭的例子,用户只是看了菜单而已,但是具体如何做的菜,用户是不知道的。饭店也不提供厨房给用户参观,对用户来说,厨房用了什么东西根本不知道,而饭店很多时候希望这样的结果,比如豆油,有各种价格的,可以用低价的提供。米饭也一样。虽然这不是个好想法。

关于我

我是IsCoding,7年Android从业经验。

QQ群号 121915371

QQ 号 1400100300

java的接口理解_原来Java的接口可以这样理解相关推荐

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java的输出流包括_【转】输入/输出流 - 深入理解Java中的流 (Stream)

    基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手.流机制也是JAVA及 ...

  3. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

  4. java提高篇四_(转)java提高篇(四)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  5. Java异常处理深入理解_关于java异常处理机制的深入理解.doc

    关于java异常处理机制的深入理解.doc 关于JAVA异常处理机制的深入理解1引子TRYCATCHFINALLY恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过 ...

  6. java集合类详解_【Java入门提高篇】Day20 Java集合类详解(三)List接口

    今天要说的是Collection族长下的三名大将之一,List,Set,Queue中的List,它们都继承自Collection接口,所以Collection接口的所有操作,它们自然也是有的. Lis ...

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

    Java面向对象之接口--interface 什么是接口 一般计算机中的接口分为硬件接口和软件接口.硬件接口:是指两个硬件设备之间的连接方式,既包括物理上的接口,还包括逻辑上的数据传送协议. 软件接口 ...

  8. java 机机接口定义_【JAVA】接口

    先问一个问题,为什么需要接口? 看例子: 需求:要求实现防盗门的功能.门有"开"和"关"的功能,所有"上锁"和"开锁"的 ...

  9. java形参列表怎么理解_关于Java中形参与实参的理解

    今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别).参考网站http://www.cnblogs.com/binyue/p/3862276.htm ...

最新文章

  1. php java session共享_php 函数session_id()思考。实现同服务器下session共享
  2. 分布式锁的实现方式——ACID数据库、缓存或者是zk
  3. enum mysql byte_九、臭名昭著的 MySQL ENUM 类型 ( 上 )
  4. 数据结构学习笔记:时间复杂度
  5. POJ1214 UVA127 Accordian Patience【vector】
  6. 【设计模式笔记】代理模式
  7. 【Java中级】(五)异常处理
  8. Jmeter集成Jira提交缺陷
  9. 【劲峰论道时空分析技术-学习笔记】2 时空可视化
  10. 【无标题】曲线坐标张量分析
  11. 清华大学计算机系招生数量,清华大学报考信息出炉,计算机报考人数最多,有些专业无人报考...
  12. Excel如何实现随机抽取
  13. cout, endl的使用
  14. 题源报刊第三季--Lesson 3--Gender equality at work is a matter of respect,not just money
  15. java多线程学习笔记--一.多线程的基础知识
  16. Apache的管理及优化——中篇{Apache的访问控制(黑白名单,用户密码认证)、Apache的虚拟主机}
  17. 区块链与分布式超级帐本技术(Hyperledger Fabric或R3 Corda)
  18. 小程序地图定位授权取消后再次授权
  19. Doo-Sabin细分算法
  20. ApolloScape自动驾驶数据集

热门文章

  1. druid seata 配置_五分钟带你了解Seata分布式事务
  2. 【JUC并发编程12】Fork与Join分支
  3. 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了
  4. 如何为你的 Github 博客添砖加瓦
  5. 蓝桥杯java第八届第八题--包子凑数
  6. JDBC连接mysql--学习目录
  7. 【JavaSE04】Java中循环语句for,while,do···while-思维导图
  8. python画画零基础_[零基础学python]画圈还不简单吗?
  9. 杭电1728bfs逃离迷宫java实现
  10. pycharm 修改成中文教程(图文简单记录)