为什么需要一个接口,一个接口的实现类,而不是直接调用类里的方法_小吴同志你好呀的博客-程序员宅基地

技术标签: java  

作者:Dion
链接:https://www.zhihu.com/question/20111251/answer/14012223
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

“接口是个规范”,这句没错。
“不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?

既然不是一个类去实现,那就是有很多地方有用到,大家需要统一标准。甚至有的编程语言(Object-C)已经不把接口叫 interface,直接叫 protocol。

统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做。
比如说:
我知道 Comparable 这个接口是用来比较两个对象的,那么如何去比较呢?
数字有数字的比较方法,字符串有字符串的比较方法,学生(自己定义的类)也有自己的比较方法。

然后,在另外一个负责对象排序(不一定是数字喔)的代码里面,肯定需要将两个对象比较。
这两个对象是什么类型呢?
Object a,b?肯定不行,a > b 这样的语法无法通过编译。
int a,b?也不行?一开始就说了,不一定是数字。

所以,Comparable 就来了。他告诉编译器,a b 两个对象都满足 Comparable 接口,也就是他们是可以进行比较的。具体怎么比较,这段程序不需要知道。
所以,他需要一些具体的实现,Comparable 接口有一个方法,叫 compareTo。那么这个方法就是用来取代 <、> 这样的运算符。
因为运算符是编译器保留给内置类型(整数、浮点数)进行比较用的,而不是一个广义的比较运算。

如果你可以明白 JDK 自身库里面诸如 Comparable 这样已经有的接口,那么就很容易理解自己在开发程序的时候为什么需要用到接口了。

这样写的第一个作用:

“不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?

可能有些同学还不知道我们探讨的具体是什么问题。这里给出例子

public abstract class Context {
public final class ContextImpl extends Context {
就如上面的文字部分所说,你怎么就保证了只有一个类会去实现这个接口呢?事实上,Context类的结构是这样的:

(图片来自郭霖博客)

但是,有的时候,我参看源码,又会发现,很多时候,一个接口只有一个实现类,他还是要这么做,这样是不是真的就多此一举了呢?

很抱歉,依然不是多此一举。在这里的作用是——项目协作,是项目模块化的利器。当你决定把一个类,仅仅给自己用,而且不打算再度扩展,那么这个时候,你可以选择不用接口+接口impl的形式。但是一旦你是进行一个团队合作的话,你就必须这么做。这个时候,接口就成为了一个约定,你的团队成员就无需在意你的代码细节,只需要关注于你的功能即可。说到这里,你是否可以想到,后台给你的东西,也叫接口?你再好好想想何为接口?难道后台返回给你所有的代码才是最合适的吗?我来替你总结一下,接口的作用之一:别人替你做了一些事,只给你你个调用口,你就可以成功地使用这个调用口,去得到他在背后默默地替你做的所有的操作所返回的结果。这,就是接口。

再说项目模块化。啥是项目模块化?我的师傅这样问我。我装B的回答:

“不太懂 我目前的认知是 组件化像sdk一样
只和调用者耦合“
师傅又问,带着怒意:
“ 模块化 懂 吗?”

我:“不懂”

师傅:“

组件化 先别 去理解 了 那个东西 没有固定的 概念
都是按个人理解
模块 化 就好开解了
好理解了
用户中心 模块
商城 模块
o2
o2o模块
聊天模块
网络请求可以 是模块 也可以叫组件
类似这样
每个模块 做每个模块固定的功能
理解了?

这回我懂了,什么聊天模块,商城模块就是模块。

这个时候你可能感觉到接口的必要性了吧! 那么我的商城模块这么多类,又互不统一,怎么才能优雅的以接口的形式暴露出来呢?

你可以弄一个托管类接口,再弄一个托管类impl,在托管类impl中进行一个调用即可。

总结一下:

1.用接口形成多实现体系,如集合框架

2.项目协作, 最小代价、最优雅地暴露功能给队友

3.模块化

最后 看了一点effective java 又领悟到了模块之间解耦的作用

这个不是我随便乱说的 我能讲通道理

interface和interfaceImpl还有调用者。本来是调用者和类直接耦合了,现在是interface和interfaceImpl建立联系,interface和调用者建立联系,我们旨在减少调用者和类的直接联系,这叫封装,也叫信息隐藏。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_38742725/article/details/102967704

智能推荐

黑马程序员-------超市库存管理系统需求说明书_黑马仓库管理系统-程序员宅基地

超市库存管理系统需求说明书1. 背景和意义对于一家生产或贸易公司,库存的控制和管理意义重大。传统人工管理的方式主要通过Excel表格以及采购、销售和仓库管理人员间口同沟通完成,效率低下而且失误率告。一家企业如果要转入现代化物流管理,库存管理信息化势在必行。商品进销存管理系统主要围绕企业内部库存管理,将采购、销售和仓库管理人员三个角色连接起来,对企业的入库,出库以及审批进行信息化管理,以提高_黑马仓库管理系统

不可多得的干货!分享一些行业经验,高级面试题+解析_赵是水瓶座的博客-程序员宅基地

前言开发10年,老码农,曾经是爱奇艺架构师,东芝集团高级工程师,三星架构师。5年之内频繁被辞退。内心拔凉拔凉的,在这五年理我思考了很多,也意识到了自己的不足。今年趁着疫情把自己知识的不足做了个查漏补缺,在这半年里一边学习,一边面试现在已经拿到了百度T7的offer下面是我这5年来的经历写成的心得,希望对大家有帮助吧!历时半年,我们终于整理出了这份市面上最全面的最新Android面试题解析大全!章节目录第一章:Android 基础 面试题第二章:Android 高级 面试题第三章:开源框架实战面

android dagger2 讲解,如何正确使用Dagger2与新的Android体系结构组件-程序员宅基地

我正在尝试使用新的体系结构组件,但我对于匕首还是一个新东西,而且我错过了一些东西。如何正确使用Dagger2与新的Android体系结构组件用下面的代码,我得到一个NullPointerException,无法找到位置。 如果还有其他需要修复或改进的地方,请提出建议。CODE: 视图模型public class PostsVM extends ViewModel {private LiveData...

数据库连接池-连接的关闭内幕_jpa 关闭数据库连接池的注解-程序员宅基地

我们经常会遇到这样那样的连接未关闭的问题,连接没有及时关闭导致的直接后果就是内存泄漏直至down机。我们也都知道解决的方式,但是在解决了问题之后经常会思考为什么会这样呢?连接close()掉,然后在创建不是很浪费cpu等系统资源嘛?有没有更好的方法解决呢?大家也经常听到连接池、线程池之类的线程、池的概念,那么究竟这些概念与我们的连接有什么关系呢? 下面我就想就上面的问题谈谈我的一点_jpa 关闭数据库连接池的注解

通过简单血液检测,或能提前5年诊查出乳腺癌!|技术前沿洞察-程序员宅基地

热点追踪 /深度探讨/ 实地探访 / 商务合作大家好,一周技术前沿洞察又和大家见面啦,本周有很多技术突破都让人眼前一亮,比如科学家们发现新血检技术或能提前5年查出乳腺癌,新的支架技术可以替代活检程序,还有能让动物换脸、能缓解交通拥堵AI,Google、英伟达等大公司们也有许多新研究和新应用,赶紧跟硅谷洞察来看看吧!海外高校通过简单血液检测,或能提前5年诊查出乳腺癌!美国时间11月3日,在2..._通过血液检测癌的图像数据集

把计算机放到手机桌面,有什么提醒软件可以把待办放在桌面上显示?-程序员宅基地

原标题:有什么提醒软件可以把待办放在桌面上显示?说起提醒软件,不少人会提出闹钟、记事本、备忘录等都可以作为提醒软件,在众多的提醒软件中,有哪些可以把软件上记录的待办事项放在桌面上显示呢?在日常办公时电脑是离不开的办公工具,如果想将记录的待办事项放在桌面上显示的话,建议可以找一些比较好用的软件,比如敬业签就是一款不错的提醒软件,在电脑上安装敬业签后,便签可以放置桌面显示,还可以根据个人的需求设置窗口..._有没有显示在手机桌面的提醒

随便推点

html5显示字母的值,使用HTML5 Canvas API控制字体的显示与渲染的方法-程序员宅基地

今天我们开始征战一个全新的内容——HTML5 Canvas的文本API!要知道,艺术家通常同时也是一个书法家,所以我们要学习写字,而且是写出漂亮的字。是不是很有意思?好了,先预告一下Canvas 文本API有哪些。属性描述font设置或返回文本内容的当前字体属性textAlign设置或返回文本内容的当前对其方式textBaseline设置或返回在绘制文本时使用的当前文本基线方法描述fillText..._html语言显示字母

ubuntu ntp时间同步服务器搭建与使用-程序员宅基地

ubuntu server ntp时间同步服务器安装及使用一、服务端1 apt-get install ntp2 安装后默认启动服务,如果没有启动,启动之。 /etc/init.d/ntp start3 vi /etc/ntp.conf 修改为如下restrict default nomodify notrap noqueryrestrict 127.0.0.1re

扒站工具Teleport Pro教程-程序员宅基地

1.下载软件http://www.jb51.net/softs/44134.html2.安装3.界面先点开帮助点注册(类似于破解要不全站扒不全)下面请看ppt,http://www.docin.com/p-633879246.html阿西吧,麻麻再也不用担心我的网站了转载于:https://www.cnblogs.com/MagicZhao123/p/64..._扒站工具网页版

[读书笔记] Deep learning by Yann LeCun1,2, Yoshua Bengio3 & Geoffrey Hinton4,5 on nature-程序员宅基地

部分摘抄自https://blog.csdn.net/amds123/article/details/70666617摘要Deep learning allows computational models that are composed of multiple processing layers to learn representations ofdata with multi...

vue学习笔记(3):classList 属性_vue classlist_檀十七的博客-程序员宅基地

本课程为中期课程,主要讲解VUE框架的原理以及使用方法和技巧,并且结合企业项目开发模式,通过案例和项目强化练习,以达到企业开发的技术水平和标准。课程中会涉及大量JS的代码和技术,JS比较薄弱的学员可以借此强化一下。 本课程为系列课程中的前置课程,后置课程为手机APP、小程序软件项目开发,因此本课程是 需要您具有HTML+CSS+JS的基础,如果您还没有HTML+CSS+JS的基础,..._vue classlist

【JVM】JVM client模式和Server模式_jvm server 模式_Elephant_King的博客-程序员宅基地

JVM Server模式和client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,新能会有很大提升JVM不显式的指定时Server模式还是client模式,JVM能够自动判断推荐在服务器上以Server模式运行,客户端或者GUI模式下可以用Client模式运行..._jvm server 模式