学习要点

  • 接口的定义
  • 接口作为约定
  • 接口作为能力

接口

为什么使用接口

需求描述

要求实现防盗门的功能(防盗门:带锁的门)。

需求分析

  1. 门有“开”和“关”的功能,锁有“上锁”和“开锁”的功能。
  2. 将门和锁分别定义为抽象类。
  3. 防盗门继承门,再继承锁,能够实现吗?//只支持单继承
  4. Java只支持单继承。
  5. 如何解决这个问题?

解决方案

将门定义为抽象类,锁定义为接口。防盗门继承门,实现锁的接口。

接口的定义

语法结构

public interface MyInterface {

    public void foo();

    //其他方法

}

  

接口中的方法都是public abstract方法,没有方法体。

接口特性

  1. 接口不可以被实例化
  2. 实现类必须实现接口的所有方法
  3. 实现类可以实现多个接口
  4. 接口中的变量都是静态常量

接口使用场合

  1. 常作为类型使用
  2. 实现Java的“多继承”

接口的使用

如何用程序描述USB接口

问题分析

USB接口:本身没有实现任何功能、规定了数据传输的要求、可以被多种USB设备实现。

使用Java接口实现

 

编码实现

接口表示一种能力

能力

  • 做这项工作需要一个程序员(电气工程师、泥瓦匠,木匠……),程序员在这里表示一种能力,而不关心具体是谁。
  • 接口是一种能力,体现在接口的方法上。

面向接口编程

我们在设计程序的时候:

  • 关心实现类有何能力,而不关心实现细节。
  • 面向接口的约定而不考虑接口的具体实现

接口作为能力实现防盗门的编程

问题分析

防盗门是一个门:防盗门和门是 is a 的关系。

防盗门有一个锁:防盗门和锁是 has a 的关系。

锁:上锁和开锁的能力。

实现过程

上机练习:扩展防盗门,增加门铃功能,门铃可以播放提示音、对出入门的人和物进行拍照存档。

理解接口作为一种能力

接口有比抽象类更好的特性:

  1. 可以被多继承
  2. 设计和实现完全分离
  3. 更自然的使用多态
  4. 更容易搭建程序框架
  5. 更容易更换实现
  6. ……

接口表示一种约定

约定

现实生活中的约定

我们使用的两相电源插座,规定了

  • 两个接头间的额定电压
  • 两个接头间的距离
  • 接头的形状

接口是一种约定

体现在接口的名称和注释上

  • 有些接口只有名称
  • 方法的实现方式通过注释来约定

面向接口编程

  • 程序设计时面向接口的约定而不考虑具体实现。

面向接口编程

案例:开发打印机

  • 墨盒:彩色、黑白
  • 纸张类型:A4、B5
  • 墨盒和纸张都不是打印机厂商提供的
  • 打印机厂商要兼容市场上的墨盒、纸张

分析

  • 墨盒和纸张的规格是一种约定
  • 打印机需要遵守这些约定
  • 用面向接口编程的方式开发
    • 制定墨盒、纸张的约定或标准
    • 打印机厂商使用墨盒、纸张的标准开发打印机
    • 其他厂商按照墨盒、纸张的标准生产墨盒、纸张

总结

Java中的接口

属性全都是全局静态常量

方法都是全局抽象方法

无构造方法

一个类可以实现多个接口,非抽象类实现接口时必须实现接口中的全部方法

抽象类利于代码复用,接口利于代码维护

JavaSE-11 接口的更多相关文章

  1. ionic访问odoo 11接口

    在架设完毕odoo 11的网站之后,第一次面临手机app该如何访问后台网站的问题,是不是模式类似asp.net mvc 那样的模式,或者还存在其他的访问方法,带着这个疑问与困惑,开始的我的研究学习之路 ...

  2. javase(11)_juc并发库

    一.传统线程技术 public static void main(String[] args) { Thread thread = new Thread(){ @Override public voi ...

  3. java基础(11):接口、多态

    1. 接口 1.1 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成. ...

  4. C#-11 接口

    一 什么是接口 接口是指定一组函数成员而不实现它们的引用类型. class Program { static void FlyFunc(IFly obj) { obj.Fly(); } static ...

  5. 11_Java面向对象_第11天(接口、多态)_讲义

    今日内容介绍 1.接口 2.多态 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的"类". 接口只描述所应该具备的方法,并没有具 ...

  6. Java 11 Tutorial

    Java 11 Tutorial 参考 https://blog.csdn.net/sihai12345/article/details/82889827 原文 https://winterbe.co ...

  7. 教你查阅Java API 英文文档(JDK 11)

    JAVA Document:https://docs.oracle.com/en/java/javase/11/ 然后找到“Specifications”并点击 API Documentation 比 ...

  8. TypeScript:基本类型和接口

    返回TypeScript手册总目录 基本类型(Basic Types) 为了让程序可以使用,我们需要用到一些最简单的数据单元:数字,字符串,结构,布尔值,诸如此类.在TypeScript中,支持许多正 ...

  9. shopncv4 短信接口 提供商 中国短信网

    前提是在后台开启手机注册功能:具体是在设置->账号同步->手机短信 里开启.   修改 siteroot\core\framework\libraries\sms.php   修改 sit ...

  10. php抽象类和接口的区别

    php抽象类和接口的区别 tags:抽象类 接口 抽象类和接口 php 引言:这是一个面试经常被问到的问题,也是一个经典问题.我们尽量引用官方权威的说明或者经过实验来证明本文所说的内容准确性. 抽象类 ...

随机推荐

  1. 并不对劲的AC自动机

    这像是能解决所有问题的样子(并不).AC自动机之所以叫AC自动机是因为它能解决所有AC自动机的题. 其实只能解决的是很多模式串匹配一个母串的问题. 把kmp中的next数组得到下一次跳转的位置看成特殊 ...

  2. Java-Runoob-高级教程-实例-字符串:10. Java 实例 - 测试两个字符串区域是否相等-uncheck

    ylbtech-Java-Runoob-高级教程-实例-字符串:10. Java 实例 - 测试两个字符串区域是否相等 1.返回顶部 1. Java 实例 - 测试两个字符串区域是否相等  Java ...

  3. maven中添加json-lib的jar包

    在maven配置文件pom.xml中添加如下配置信息: <dependency> <groupId>net.sf.json-lib</groupId> <ar ...

  4. Find offset of first/last found substring

    DATA: TEXT TYPE STRING VALUE 'RO_LL_OVER BEET_HOVEN', MOFF TYPE I VALUE '-1'. FIND FIRST OCCURRENCE ...

  5. E20180207-ts

    crumb n. 碎屑(尤指面包屑或糕饼屑); 面包心; 些许,少许; <俚>可鄙的人物;

  6. HDU5996:dingyeye loves stone

    题目链接:dingyeye loves stone 题意:给出一棵树,树上的每个节点都有石子若干, 两人博弈,每次操作都可以把任意节点的任意石子数转移到它的父亲节点, 若无法操作则输,给出树上的节点及 ...

  7. Excel学习 -- 函数基础

    Excel函数基础 1. 单元格是函数的作用对象:    2. 函数由等号.函数表达式.操作符.参数.返回值五部分组成:    3. 商业智能报表中使用的常用函数分类:数学函数.文本函数.逻辑函数.查 ...

  8. Spring Json数据

    json 数据转换 @RequestBody 用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter 进行解析,然后把相应的数据绑定到Controll ...

  9. IEEE Trans 2006 使用K-SVD构造超完备字典以进行稀疏表示(稀疏分解)

    K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个原子的线性组合来表示的.    K-SVD算法总体来说可以分成两步 ...

  10. Ubuntu 必装软件及安装教程

    安装搜狗拼音输入法 因为sogou是基于fcitx的,所以先添加fcitx键盘输入法系统[系统默认是iBus].在终端中,输入命令将下载源添加至系统源(添加依赖). sudo add-apt-repo ...