技术标签: 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和调用者建立联系,我们旨在减少调用者和类的直接联系,这叫封装,也叫信息隐藏。
Spark是个灰常强大的东西……实际上要说分布式集群神马的,Spark和hadoop一类的分布式计算框架,作为此轮大数据浪潮的尖刀,各种摧城拔寨,所向披靡,但是你真的对S..._arcgis pysparkpython
#includeunsigned char flag,num;void main(){ TMOD=0x20;//定时器1工作方式2 TH1=0xfd; TL1=0xfd;//初值设定 SM0=0; SM1=1;//串口工作方式设置,即SCON=0X50; 选择工作模式1使能接收,允许发送,允许接收 PCON = 0x80;//1000_sm1=1
最近工作碰到一个问题,在登录后找不到页面了,报了个500的错误,查看控制台报org.apache.coyote.http11.HeadersTooLargeException 这个错误,于是百度一下原因发现是tomcat未设置最大请求数据 在tomcat里的server.xml中设置 maxHttpHeaderSize ="102400" 即可...
如何成为一名全栈语音识别工程师?http://blog.sciencenet.cn/blog-1375795-1085914.html11月16号,百度发布了渡鸦智能音箱和DuerOS开发板SoundPi,至此,国内再一名巨头加入智能音箱大战。迄今为止,国内战场上的巨头有阿里、京东、腾讯、百度、小米、科大讯飞等,国外则有苹果、微软、亚马逊、谷歌、脸书、三星等,这些巨
参考原文:作者:xushiluo原文链接:https://www.jianshu.com/p/f3d58072c85d1.问题描述ArcGIS Desktop本身集成的Python2安装第三方包的时候比较麻烦,虽然网上有很多方法,但借助Anaconda安装是一个相对比较方便的做法。2.软件环境ArcGIS Desktop 10.2.2Anaconda 3以上是我的软件版本,A...
程序运行:3.小球测定引力常数(μ\muμ、σ2{\sigma}^2σ2的置信区间)以金球为例,程序运行:三、经验分布函数1.定义//参数解释(待补充……)//参数解释待补充,特别注意那个sss样本总数为200,205.5309−200=5.5309..._统计建模没有数学公式
1. 原因eclipse缺少servlet-api.jar 这个jar包2. 解决方法2.1 方法一:从tomcat的lib目录下导入servlet-api.jar项目右键>>Properties>>Jvav Build Path>>Libraries>>Add External JARS…2.2 方法二:pom.xml中加入一下依赖&l..._程序包javax.servlet.http不存在
VS2019安装教程_vs2019
点击补时时逐次累计,一次加一分钟,点击开始计时开始倒计时,倒计时完成后蜂鸣器报警。上代码include //51单片机头文件include //51库函数define uchar unsigned char //宏定义define uint unsigned intsbit duan = P2^6;//段选接P2.6引脚sbit wei = P_补时器
简介:笔者在学习人脸识别模块时发现需要安装一个名为face_recognition的库,但其在Windows系统中不能直接pip,必须先安装dlib库。本文就来介绍如何快速的在Windows系统下安装dlib和face_recognition。环境:Windows、python3.7、pycharm。步骤1、下载安装dlib库:下载链接:link提取码:hfpc安装:①打开命令提示行;②找到解压后的dlib所在的文件夹;③输入命令:pip install dlib文件名(后缀必须是.w
文章目录第九章 真实感图形学9.1 真实感图形学概述9.2 颜色模型9.2.1 颜色及颜色模型概述9.2.2 RGB颜色工业模型9.2.3 其他颜色工业模型9.2.4 颜色视觉模型9.3 简单光照模型9.3.1 光照模型的发展9.3.2 光照背景物理知识9.3.3 Phong光照模型9.4 增量式光照模型9.4.1 光暗处理9.4.2 Gouraud明暗处理9.4.3 Phong明暗处理9.5 局部光照模型9.5.1 局部光照模型概述9.5.2 理论基础9.5.3 局部光照明模型9.6 光透射模型9.6.1
https://mp.weixin.qq.com/s/y6eB8zaM5mFsv3AhKnEdNg