我是个初学者,刚开始的时候,学习java有这样的一种困惑,就是接口是用来干什么的,为什么有了继承,还要定义接口进行继承,不是多此一举吗。

后来看了一些资料,懂了一些

现具体功能时,接口和实现的类分离。接口定义为XxxService,实现为XxxServiceImpl。

接口提供了一个公用的方法提供方。 接口是用来规定子类的行为的。

面向接口编程的好处:

1.根据客户提出的需求提出来,作为接口的;业务具体实现是通过实现接口类来完成的。

2.当客户提出新的需求时,只需编写该需求业务逻辑新的实现类。

3.假如采用了这种模式,业务逻辑更加清晰,增强代码可读性,扩展性,可维护性。

4.接口和实现分离,适合团队协作开发。

5.实现松散耦合的系统,便于以后升级,扩展。

耦合

个人觉得就是因为耦合的缘故,所以延伸出接口这一个概念。

接下来引用一个博主的典型示例https://blog.csdn.net/qq_24886697/article/details/78580509

通俗的讲,就是为了降低耦合度。

一个很搞笑的例子: 
看看下面的程序: 一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉。 
------------------------------ 
public interface 人{ 
    void 吃饭();
    void 睡觉(); }

public class 学生 implements 人{ 
    public void 吃饭(){ 
        //去食堂吃饭 }

public void 睡觉(){ 
        //回寝室睡觉 } 
    //其他特有方法,比如泡妞、打游戏 }

public class 老师 implements 人{ 
    public void 吃饭(){ 
        //回家吃饭 }

public void 睡觉(){ 
        //回家睡觉 }

//其它特有方法,比如为生儿育女传宗接代的历史使命努力等不足为外人道的事情 }

public class 学校{ 
    public void 开饭(人 ren){ 
    ren.吃饭(); }

public void 放学(人 ren){ 
    ren.睡觉(); } }

----------------------------- 
这里就用到了里氏代换原则,"开饭()"和"放学()"的参数都是人,那么这个地方如果换成学生和老师肯定也可以。 
   人 a = new 学生(); 
     学校.开饭(a); 学校.放学(a); 
这样执行的结果就是学生回寝室吃饭。

人 b = new 老师(); 
    学校.开饭(b); 学校.放学(b); 
这样执行的结果就是老师回家吃饭。

为什么要这样写呢?这样写有什么好处呢? 我在开饭的时候完全可以直接调用"学生.吃饭();"、"老师.吃饭();"啊。 接着看。 有一天,学校里来了第三种人,家长。 家长既不是去寝室睡觉也不是回家睡觉,而是旅馆睡觉,既不是去食堂吃饭也不是回家吃饭,而是去下馆子。 这个时候学校这个系统该怎么处理呢? 如果原来没有定义"人"这个接口那就麻烦啦,所有用到人的地方代码都要改。 现在不一样了,我可以直接定义一个类:家长,这个类实现人这个接口就可以了。

好,看代码: 
------------------------------ 
public class 家长 implements 人{ 
    public void 吃饭(){ 
        //下馆子 }

public void 睡觉(){ 
        //去旅馆睡觉 }

//其它特有方法,比如会见老师,晓之以钱,动之以利等等,不一而足 } 
-------------------------------

在调用的时候不需要修改任何代码,还和原来一样: 
    人 c=new 家长(); 
       学校.开饭(c); 
       学校.放学(c); 
轻松搞定家长的食宿问题!

这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性! 不知道初学者看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办! 先声明一下,这个案例可不是我想出来的~~ 然后我们就很好理解了,为什么用别人的东西要实现接口呢?很直接的一个原因是这样一来,编程的复杂度就可能会大大降低了。

有了继承,为什么要定义接口相关推荐

  1. CLR via C#学习笔记-第十三章-定义接口、继承接口

    13.1 类和接口继承 接口是为了实现多继承 所有的类都继承了System.Object,及其四个公共实例方法:ToString.Equals.GetHashCode.GetType. CLR允许定义 ...

  2. Spring Boot 定义接口的方法是否可以声明为 private?

    我们在 Controller 中定义接口的时候,一般都是像下面这样: @GetMapping("/01") public String hello(Map<String,Ob ...

  3. 【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货

    –本文摘要–     1.本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承.抽象类.接口.多态等等概念搞不清的初学者.     2.本文的内容摘要:讲述Java中的一 ...

  4. java为什么要定义接口_java为什么要定义接口等相关解释

    3.abstract关键词能让你在类里创建一个或多个没有定义的方法-你给出接口,但是留一部分没做定义,这部分由它的派生类来实现.而interface关键词则创建了一种完全抽象的,根本不提供实现的类,它 ...

  5. java定义接口_一文知道Java中接口的定义

    使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: 方法:接口中的方法只有定义而没有被实现. ...

  6. Java语言用于定义接口的关键字是_定义类的保留字是(__)定义接口的保留字是(__);...

    [单选题]为了使包sos在当前程序中可见,可以使用的语句是( ) [单选题]方法的作用不包含:( ) [判断题]水平方向布置的三相平行导体在发生三相短路时 , 最大电动力出现在 A 相. ( ) [单 ...

  7. 接口可以继承抽象类吗_Python接口类的多继承以及抽象类的单继承

    一.接口类(面向对象开发的思想和规范)的多继承 需求: 定义一个tiger类:会走,会游 定义一个hawk类:会走,会飞 定义一个swan类:会走,会游,会飞 (a)如果像以下代码的方式,则不能够满足 ...

  8. (1)定义接口A,里面包含值为3.14的常量PI和抽象方法double area()。 (2)定义接口B,里面包含抽象方法void setColor(String c)。

    代码 /*第一题:(1)定义接口A,里面包含值为3.14的常量PI和抽象方法double area().(2)定义接口B,里面包含抽象方法void setColor(String c).(3)定义接口 ...

  9. 深入继承之抽象类和接口综合分析及完整案列解说(一)

    首先感谢园里的一位前辈anytao.cnblogs.com ,他对面向抽象类和接口编程作出比较完善的总结.下面的总结是直接Copy他的原话. 一.相同点 ● 都不能被直接实例化,都可以通过继承实现其抽 ...

最新文章

  1. Ubuntu下非常给力的下载工具–aira2
  2. SQL Server 2008创建数据库
  3. 怎么做圆一圈圈扩散效果_推广为什么没有效果,网络推广怎么做才有效果?
  4. requests库怎么安装在python中-python安装requests库的实例代码
  5. linux内核驱动模块开发makefile实例解析
  6. 操作系统知识回顾(5)-内存管理
  7. [转]HTTP协议简单原理资源
  8. 苹果手机升级后开不了机怎么办_iPhone8突然黑屏开不了机怎么办?西安苹果售后维修点教你这样解决...
  9. Android常用逆向工具+单机游戏破解
  10. MindManager 2020下载与使用
  11. Windows应用程序未响应怎么办文件还没保存呢,是什么原因导致的应用程序未响应?
  12. 磁吸数据线的特点与优势
  13. 怎样批量修改图片名称,一键处理
  14. CSS五种方式实现 Footer 置底
  15. 特性(Feature)与功能(Function)的差异
  16. (美化)WordPress网站添加自定义字体
  17. C语言调用函数时参数传递实测(好久以前记录的)
  18. 【汇编语言实战】一元二次方程ax2+bx+c=0求解(含源码与过程截屏,可修改参数)
  19. Crisis Dents Putin's Popularity
  20. (附源码)node.js华联招聘网站 毕业设计 011229

热门文章

  1. stm32通过wifi模块实现手机远程控制灯与舵机
  2. Mac环境下Docker(19.03.5)镜像加速器配置
  3. android监听来电去电广播
  4. 【ppt课件制作】Focusky教程 | 字体选择
  5. react-antd项目,一个多tab页面,共用一个title相同的table表格,并且在切换tab时实现数据更新
  6. Jmeter性能测试环境安装
  7. 实收资本和注册资本\营业执照和法人营业执照的区别
  8. 华为战略部门研究山寨机决定出售手机部门
  9. PLGA-PEG-PLGA 聚二乙醇-聚乳酸乙醇酸共聚物/α-CD-PEG-PPRα-环糊精-聚乙二醇-聚轮烷
  10. 124-统计学概率论之二项分布