• [05] 接口



    1、接口的声明

    接口是一系列抽象的集合,简单地说,它更像特殊的抽象类,类似所有方法都是抽象方法的抽象类

    当然,这只是简单地说法,还是稍有不同的:
    • 抽象类可以有构造方法,接口没有构造方法
    • 抽象类可以有成员变量,接口只能有常量

    接口的声明不像抽象类使用 abstract class,而是使用新的关键字 interface:
    【修饰符】 interface 接口名 【extends 父接口名列表】{  
        【public】【static】【final】常量;
        【public】【abstract】方法;
    }

    • 修饰符只是为public,即不写,默认值也是public
    • 接口可以继承父接口,且可以实现接口多继承(因为方法都是抽象方法)
    • 方法只能有定义,没有实现
    • 常量和方法的三个修饰符都可以省略

    总结接口和抽象方法的区别就在于:

    抽象类    接口
    属性    无限制    只能有静态常量
    构造方法    可有可无    没有    
    普通方法    可以有具体实现的方法必须是抽象方法    
    子类    单一继承    多重实现



    2、类实现接口

    子类和父类我们使用的是继承,而类和接口之间的关系我们使用的是“实现”,其本质和继承是相似的,区别在于,一个类只能继承一个父类,而一个类可以同时实现多个接口(多个接口用逗号隔开)。

    实现接口采用 implements 关键字:
    【访问权限修饰符】【修饰符】class 类名 implements 接口列表 {
      类体
    }

    所以,接口实际上只是定义类要实现的操作,即“what to do”,而由类去实现接口,覆盖其中的方法,实现“how to do”。



    3、接口的作用

    多态!多态!多态!重要的事情说三遍!

    接口最常用的,和我们在多态中提到过的一样,如果我们使用 “ 接口名  对象名 = new 实现接口的类 ”,就可以起到像USB插口一样的作用,插什么读什么,如果有接口定义了方法read,那么我们 new Map3(),就使用Map3的read;new Mp4(),就使用Mp4的read。

    这叫做统一访问,为什么要像这样多此一举?

    还是刚才的例子,假如我们电脑有某个插口用来传输多媒体文件,设定为只能读取Mp3,要把歌曲从电脑存进Mp3嘛,离线听才方便,可是后来突然不流行用Mp3听歌了,大家升级了用Mp4,没办法,为了顺应市场,你只能把这个插口改成读取Mp4,或许未来出现了MpN的话,你又得改这个接口。

    这里的麻烦就在于,你的插口形状是去为了适应设备而不断更改,设备更换,插口也要更换;我们换个思路,将插口形状固定下来,让各种设备来匹配我们的插口,这样一来,你的插口就是接口,完全不用改变,而由设备去实现接口。

    写代码的过程也是这样,程序员之间是相互协作的,程序员B调用了程序员A写的东西,程序员A只需要给B一个接口即可,让B去调用接口定义好的方法,假如因为需求的变化,程序员A也只需要修改接口实现类,而调用者B完全无需关心如何改变,B写的代码也不需要变动。这里程序员B就像是刚才例子里的电脑,调用的接口就像USB插口,各种设备就是程序员A针对接口写的各种实现。

    再举个例子,就像我们项目中的业务层调用了持久层的方法,一般都是调用持久层接口的方式,假如我们业务类不是使用持久层接口,而是具体的持久层类,那么我数据库一旦有更改需求,业务层中的相应代码也需要全部变动。


  • 相关阅读:
    vue中的样式
    v-model 双向数据绑定
    v-on 事件修饰符
    Linq Join
    Elasticsearch.Net 异常:[match] query doesn't support multiple fields, found [field] and [query]
    MongoDB开启权限认证
    elasticsearch备份与恢复
    elasticserach + kibana环境搭建
    Kibana TypeError : Object #<GlobalState> has no method 'setDefaults'
    匿名函数
  • 原文地址:https://www.cnblogs.com/deng-cc/p/7462220.html
Copyright © 2020-2023  润新知