接口

学习内容

  • 接口
    • 接口的基础语法
    • 向下转型问题
      • 类与类之间的向下转型
      • 接口与接口之间的向下转型
      • 类与接口之间的向下转型
    • 抽象类与接口的区别
    • 不同版本接口的特性
    • 接口在开发中的作用
    • 面向接口开发案例
  • 思维导图

接口的基础语法

  1. 接口是一种引用数据类型,编译后生成字节码文件。
  2. 接口是完全抽象的(类是半抽象的),或者说接口是一种特殊的抽象类。
  3. 接口与接口之间支持多继承。
  4. 接口中只包含常量和抽象方法(java7之前(包括7))。
  5. 接口中所有的元素都是被public修饰的。
  6. 接口中的抽象方法在定义时可以省略"public abstract"。
  7. 接口中的常量在定义时可以省略"public static final"。
  8. 一个非抽象类实现了接口,要求这个类重写接口中所有的抽象方法(抽象类可以不重写)
  9. 一个类可以实现多个接口
  10. extends和implements可以共存,语法格式是:[修饰符列表] 类名 extends 类名 implement 接口名{}
  11. 接口的定义:[修饰符列表] 接口名 {}

向下转型问题

类与类之间的向下转型

  1. 要求类与类之间必须有继承关系,没有继承关系编译器会报错
  2. 如果两个类之间有继承关系可以通过编译期,但是在运行期也可能出现ClassCaseException
public class Test2 {public static void main(String[] args){D d = new A();B b = (B)d;}
}
class A extends D{}
class B extends D{}class D{}


在编译期,编译器检测到D的子类有A和B。所以将D类型的d转换成B类型编译器会认为是合法的(骗过编译器)。但是在运行期检测到d实际是A类型,而A类型与B类型没有继承关系(A不是B),无法转换。所以在此处抛出CaseException

接口与接口之间的向下转型

  接口与接口之间没有继承关系也可以进行转型,只不过会在运行期可能会出现ClassCaseException

public class Test3 {//接口与接口之间的转型public static void main(String[] asrgs){D d = new A();E e = new B();E e2 = (E)d;  }
}
class A implements D{public void method1(){}}
class B implements E{public void method2(){}}interface D{void method1();}interface E{void method2();}

运行结果如下,可以看出接口与接口之间没有继承关系可以通过编译期,但是在运行期间可能会出现ClassCaseException

在编译期,编译器检查到d是D类型;在运行期,检测到d实际是A类型,而A类型与E类型没有实现关系(A不像E),所以此处会出现异常。那么如果A类型与同时与D类型和E类型有实现关系在运行期间就不会出现ClassCase异常么,我们来看以下代码

public class Test3 {//接口与接口之间的转型public static void main(String[] asrgs){D d = new A();E e = new B();E e2 = (E)d;  }
}
class A implements D,E{public void method1(){}public void method2(){}
}
class B implements E{public void method2(){}}interface D{void method1();}interface E{void method2();}

运行结果如下,可以看出如果一个类同时实现了多个接口,哪怕这些接口之间没有继承关系,这些接口之间也能彼此进行转型,同时能通过编译期和运行期


当然这么转型后实现类只能调用转型后接口中的方法,否则无法通过编译期,具体我们可以看下面的代码

public class Test3 {//接口与接口之间的转型public static void main(String[] asrgs){D d = new A();E e = new B();E e2 = (E)d;  e2.method1();}
}
class A implements D,E{public void method1(){}public void method2(){}
}
class B implements E{public void method2(){}}interface D{void method1();}interface E{void method2();}

类与接口之间的向下转型

  1. 如果类与接口之间没有实现关系编译期会报错
  2. 如果类与接口之间有实现关系,在运行期间可能会出现ClassCaseException
public class Test3 {//类与接口之间的向下转型public static void main(String[] asrgs){E e = new A();B b = (B)e;}}
class A implements D,E{public void method1(){}public void method2(){}
}
class B implements E{public void method2(){}}interface D{void method1();}interface E{void method2();}
interface F{}

抽象类与接口的区别

  1. 抽象类是半抽象的,接口时完全抽象的
  2. 抽象类中有构造方法,接口中不能有构造方法
  3. 接口与接口之间支持多继承,类与类之间只支持单继承
  4. 一个类可以实现多个接口,但一个类只能继承一个类
  5. 接口中只允许有常量和抽象方法(java7之前)

不同版本接口的特性

接口在开发中的作用

 面向接口编程,降低程序之间的耦合度,提高程序的扩展力

面向接口开发案例

用接口模拟一个人去餐馆点餐场景,接口(菜单),接口的实现类(厨师),接口的调用者(客户)

#mermaid-svg-0EQuBWIk9uCqtSDb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0EQuBWIk9uCqtSDb .error-icon{fill:#552222;}#mermaid-svg-0EQuBWIk9uCqtSDb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0EQuBWIk9uCqtSDb .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-0EQuBWIk9uCqtSDb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0EQuBWIk9uCqtSDb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0EQuBWIk9uCqtSDb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0EQuBWIk9uCqtSDb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0EQuBWIk9uCqtSDb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0EQuBWIk9uCqtSDb .marker.cross{stroke:#333333;}#mermaid-svg-0EQuBWIk9uCqtSDb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0EQuBWIk9uCqtSDb g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-0EQuBWIk9uCqtSDb g.classGroup text .title{font-weight:bolder;}#mermaid-svg-0EQuBWIk9uCqtSDb .nodeLabel,#mermaid-svg-0EQuBWIk9uCqtSDb .edgeLabel{color:#131300;}#mermaid-svg-0EQuBWIk9uCqtSDb .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-0EQuBWIk9uCqtSDb .label text{fill:#131300;}#mermaid-svg-0EQuBWIk9uCqtSDb .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-0EQuBWIk9uCqtSDb .classTitle{font-weight:bolder;}#mermaid-svg-0EQuBWIk9uCqtSDb .node rect,#mermaid-svg-0EQuBWIk9uCqtSDb .node circle,#mermaid-svg-0EQuBWIk9uCqtSDb .node ellipse,#mermaid-svg-0EQuBWIk9uCqtSDb .node polygon,#mermaid-svg-0EQuBWIk9uCqtSDb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0EQuBWIk9uCqtSDb .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-0EQuBWIk9uCqtSDb g.clickable{cursor:pointer;}#mermaid-svg-0EQuBWIk9uCqtSDb g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-0EQuBWIk9uCqtSDb g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-0EQuBWIk9uCqtSDb .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-0EQuBWIk9uCqtSDb .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-0EQuBWIk9uCqtSDb .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-0EQuBWIk9uCqtSDb .dashed-line{stroke-dasharray:3;}#mermaid-svg-0EQuBWIk9uCqtSDb #compositionStart,#mermaid-svg-0EQuBWIk9uCqtSDb .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0EQuBWIk9uCqtSDb #compositionEnd,#mermaid-svg-0EQuBWIk9uCqtSDb .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0EQuBWIk9uCqtSDb #dependencyStart,#mermaid-svg-0EQuBWIk9uCqtSDb .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0EQuBWIk9uCqtSDb #dependencyStart,#mermaid-svg-0EQuBWIk9uCqtSDb .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0EQuBWIk9uCqtSDb #extensionStart,#mermaid-svg-0EQuBWIk9uCqtSDb .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0EQuBWIk9uCqtSDb #extensionEnd,#mermaid-svg-0EQuBWIk9uCqtSDb .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0EQuBWIk9uCqtSDb #aggregationStart,#mermaid-svg-0EQuBWIk9uCqtSDb .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0EQuBWIk9uCqtSDb #aggregationEnd,#mermaid-svg-0EQuBWIk9uCqtSDb .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0EQuBWIk9uCqtSDb .edgeTerminals{font-size:11px;}#mermaid-svg-0EQuBWIk9uCqtSDb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

Customer
«interface»
FoodMenu
xiHongShi()
rouSi()
AmericaCook
ChinaCook
//顾客
class Customer {FoodMenu foodMenu;      //菜单public void order () {foodMenu.xiHongShi();foodMenu.rouSi();}public Customer(){}public Customer(FoodMenu foodMenu){this.foodMenu = foodMenu;}
}
//菜单
interface FoodMenu{//西红柿炒鸡蛋void xiHongShi();//香辣肉丝void rouSi();
}//中国厨师
class ChinaCook implements FoodMenu {public void xiHongShi() {System.out.println("中国厨师做的西红柿炒鸡蛋");}public void rouSi() {System.out.println("中国厨师做的香辣肉丝");}
}//美国厨师
class AmericaCook implements FoodMenu {public void xiHongShi() {System.out.println("美国厨师做的西红柿炒鸡蛋");}public void rouSi() {System.out.println("美国厨师做的香辣肉丝");}
}public class Test {public static void main(String[] args) {//厨师FoodMenu cook1 = new AmericaCook();FoodMenu cook2 = new ChinaCook();//顾客找美国厨师Customer customer = new Customer(cook1);customer.order();//顾客找中国厨师customer.foodMenu = cook2;customer.order();}
}

通过上面的代码可以看出,通过接口(FoodMenu),降低了类(Customer)与类(AmericaCook/ChinaCook)之间的耦合度,程序的扩展力很高

思维导图

Xmind文件/OneDriver共享

2022-07-25 第五小组 顾祥全 学习笔记 day18-JavaSE-接口相关推荐

  1. 2022 -7-18 第八小组 顾宇佳 学习笔记

    一.面向对象 java是一门面向对象的一种编程语言,在java中,万事万物皆对象. 面向过程:面向过程就是分析出实现需求需要的步骤,通过一些方法一步一步去实现需求. 面向对象(行为化):把整个需求的按 ...

  2. 0.《新概念51单片机C语言教程》(郭天祥)学习笔记

    看到之前的阅读量,有标题党的嫌疑,再接再厉,加油坚持自己的文风,相信会写的越来越好:) 继续更(一个人,一个记事本,一个PDF阅读器,装备全靠打) <新概念51单片机C语言教程>(郭天祥) ...

  3. ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10)

    ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10) Scalers点评:机器学习小组是成长会的内部小组,这是成长会机器学习小组第21周学习笔记,也是深度学习第10次的复盘笔记 ...

  4. 郑莉老师c++第五版+b站视频 学习笔记

    本文是系统学习 郑莉c++第五版+b站视频的学习笔记. 郑莉老师b站内容分为 导学 文章目录 第0章:学习怎么学习--论道开篇+怎样学c++ 论道开篇 怎样学c++ 第1章绪论 导学笔记(学堂在线+b ...

  5. 《五分钟商学院》管理篇学习笔记

    [商业知识]| 作者 / Edison Zhou 这是恰童鞋骚年的第213篇原创文章 在商业篇中,主要探讨的是企业如何处理与外部(比如客户)的关系.而在管理篇中,关注的重点则是企业如何处理与内部的关系 ...

  6. 2022.07.25 学习笔记

    学习笔记 使用in查询效率慢 当使用sql进行查询的时候,某些时候使用in,即使in的集合元素数量比较少,数据库中数据较少,但是查询的速度还是很慢,如下: SELECTcreatetTimer,ip, ...

  7. 2022/07/25 吉软 Java基础(10)面向对象——多态

    1.多态(动态绑定) 动态绑定是指在运⾏期间,判断所引⽤对象的实际类型,根据其实际的类型调⽤相应的⽅法,多态即:⼀个对象具有多种状态的⾏为. 1.1.多态的3个必要条件 要有继承 要有重写 父类的引用 ...

  8. 2022-07-08 第七小组 闫馨月 学习笔记

    单丝不成线,独木不成林,只有携手并进,才能共赢.强者抱团,渡人渡己,人与人之间最好的关系就是坦诚相待,彼此成就,合作共赢! 在2022年7月8日有幸参与盛世吉软组织为期一天的团队素质拓展训练,除了身体 ...

  9. 奇安信病毒检测中心 2022年第二季度App收集个人信息检测报告 学习笔记 附下载地址

    奇安信 2022年第二季度App收集个人信息检测报告 下载地址 2022年第二季度 APP收集个人信息 检测报告 奇安信 病毒响应中心 研究背景 随着互联网和移动设备的发展,手机已成为人人都拥有的设备 ...

  10. python123第五章_python 3.5学习笔记(第五章)

    本章内容 1.什么是模块 2.模块的导入方法 3.搜索路径 4.重要标准库 一.什么是模块 1.模块本质上是一个以.py 结尾的python文件,包含了python对象定义和python语句. 2.模 ...

最新文章

  1. python colormap函数_python-使用由x,y位置定义的rgb值创建colormap
  2. 闲谈IPv6-典型特征的一些技术细节
  3. wps android qq 群,手机WPS怎样发送文档给QQ?WPS怎样发送文档给QQ教程
  4. 那年大一在图书馆作死的大学高数笔记 | 函数和极限
  5. 2017/Province_Java_B/3/承压计算
  6. 17 张程序员壁纸(赶快挑一张吧)
  7. 使用工厂模式解决设计问题
  8. IDF实验室-图片里的英语
  9. 前端学习(2449):发布文章组件
  10. 计算机ppt文字1是什么原因,ppt让答案一个个出现,ppt让文字一个个出现
  11. sql配置管理器服务是空的_PostgreSQL 12 安装和配置
  12. Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例
  13. code css怎么拿不到div_哈登和威少再怎么努力,也追不上杜兰特,因为刷子是拿不到冠军的...
  14. 提升 JavaScript 技能的5个小技巧,新手小白值得学习!
  15. 项目业务工作笔记001---发改委职责
  16. ubuntu16.04安装pycharm,并设置快捷启动方式
  17. Python实用笔记 (27)面向对象高级编程——使用枚举类
  18. VAST2.0视频广告投放解决方案改变视频网站未来技术格局
  19. 2021年CentOS7安装Oracle11g全记录
  20. php电子病历毕业设计,基于区块链的电子病历系统设计与实现(自制毕设)

热门文章

  1. DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution
  2. 《今日求职》之拉勾网Android客户端产品说明
  3. 小智-微直播 使用教程
  4. jieba——分词、添加词典、词性标注、Tokenize
  5. C++ 脚本解释器cint
  6. <C++>运算符重载进阶之左移运算符,输出成员属性一步到位
  7. 使用CSS过滤器让透明的彩色png图像变纯白
  8. 内网安全 域环境的搭建(模仿真实内网环境 做渗透测试.)
  9. uWSGI +Flask+torch Cannot re-initialize CUDA in forked subprocess
  10. 使用 Apache FOP 2.3 + docbook-xsl-ns-1.79.1 转换 Docbook 5.1 格式的 XML 文档成 PDF/RTF 文件