2022-07-25 第五小组 顾祥全 学习笔记 day18-JavaSE-接口
接口
学习内容
- 接口
- 接口的基础语法
- 向下转型问题
- 类与类之间的向下转型
- 接口与接口之间的向下转型
- 类与接口之间的向下转型
- 抽象类与接口的区别
- 不同版本接口的特性
- 接口在开发中的作用
- 面向接口开发案例
- 思维导图
接口的基础语法
- 接口是一种引用数据类型,编译后生成字节码文件。
- 接口是完全抽象的(类是半抽象的),或者说接口是一种特殊的抽象类。
- 接口与接口之间支持多继承。
- 接口中只包含常量和抽象方法(java7之前(包括7))。
- 接口中所有的元素都是被public修饰的。
- 接口中的抽象方法在定义时可以省略"public abstract"。
- 接口中的常量在定义时可以省略"public static final"。
- 一个非抽象类实现了接口,要求这个类重写接口中所有的抽象方法(抽象类可以不重写)
- 一个类可以实现多个接口
- extends和implements可以共存,语法格式是:[修饰符列表] 类名 extends 类名 implement 接口名{}
- 接口的定义:[修饰符列表] 接口名 {}
向下转型问题
类与类之间的向下转型
- 要求类与类之间必须有继承关系,没有继承关系编译器会报错
- 如果两个类之间有继承关系可以通过编译期,但是在运行期也可能出现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();}
类与接口之间的向下转型
- 如果类与接口之间没有实现关系编译期会报错
- 如果类与接口之间有实现关系,在运行期间可能会出现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{}
抽象类与接口的区别
- 抽象类是半抽象的,接口时完全抽象的
- 抽象类中有构造方法,接口中不能有构造方法
- 接口与接口之间支持多继承,类与类之间只支持单继承
- 一个类可以实现多个接口,但一个类只能继承一个类
- 接口中只允许有常量和抽象方法(java7之前)
不同版本接口的特性
接口在开发中的作用
面向接口编程,降低程序之间的耦合度,提高程序的扩展力
面向接口开发案例
用接口模拟一个人去餐馆点餐场景,接口(菜单),接口的实现类(厨师),接口的调用者(客户)
//顾客
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-接口相关推荐
- 2022 -7-18 第八小组 顾宇佳 学习笔记
一.面向对象 java是一门面向对象的一种编程语言,在java中,万事万物皆对象. 面向过程:面向过程就是分析出实现需求需要的步骤,通过一些方法一步一步去实现需求. 面向对象(行为化):把整个需求的按 ...
- 0.《新概念51单片机C语言教程》(郭天祥)学习笔记
看到之前的阅读量,有标题党的嫌疑,再接再厉,加油坚持自己的文风,相信会写的越来越好:) 继续更(一个人,一个记事本,一个PDF阅读器,装备全靠打) <新概念51单片机C语言教程>(郭天祥) ...
- ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10)
ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10) Scalers点评:机器学习小组是成长会的内部小组,这是成长会机器学习小组第21周学习笔记,也是深度学习第10次的复盘笔记 ...
- 郑莉老师c++第五版+b站视频 学习笔记
本文是系统学习 郑莉c++第五版+b站视频的学习笔记. 郑莉老师b站内容分为 导学 文章目录 第0章:学习怎么学习--论道开篇+怎样学c++ 论道开篇 怎样学c++ 第1章绪论 导学笔记(学堂在线+b ...
- 《五分钟商学院》管理篇学习笔记
[商业知识]| 作者 / Edison Zhou 这是恰童鞋骚年的第213篇原创文章 在商业篇中,主要探讨的是企业如何处理与外部(比如客户)的关系.而在管理篇中,关注的重点则是企业如何处理与内部的关系 ...
- 2022.07.25 学习笔记
学习笔记 使用in查询效率慢 当使用sql进行查询的时候,某些时候使用in,即使in的集合元素数量比较少,数据库中数据较少,但是查询的速度还是很慢,如下: SELECTcreatetTimer,ip, ...
- 2022/07/25 吉软 Java基础(10)面向对象——多态
1.多态(动态绑定) 动态绑定是指在运⾏期间,判断所引⽤对象的实际类型,根据其实际的类型调⽤相应的⽅法,多态即:⼀个对象具有多种状态的⾏为. 1.1.多态的3个必要条件 要有继承 要有重写 父类的引用 ...
- 2022-07-08 第七小组 闫馨月 学习笔记
单丝不成线,独木不成林,只有携手并进,才能共赢.强者抱团,渡人渡己,人与人之间最好的关系就是坦诚相待,彼此成就,合作共赢! 在2022年7月8日有幸参与盛世吉软组织为期一天的团队素质拓展训练,除了身体 ...
- 奇安信病毒检测中心 2022年第二季度App收集个人信息检测报告 学习笔记 附下载地址
奇安信 2022年第二季度App收集个人信息检测报告 下载地址 2022年第二季度 APP收集个人信息 检测报告 奇安信 病毒响应中心 研究背景 随着互联网和移动设备的发展,手机已成为人人都拥有的设备 ...
- python123第五章_python 3.5学习笔记(第五章)
本章内容 1.什么是模块 2.模块的导入方法 3.搜索路径 4.重要标准库 一.什么是模块 1.模块本质上是一个以.py 结尾的python文件,包含了python对象定义和python语句. 2.模 ...
最新文章
- python colormap函数_python-使用由x,y位置定义的rgb值创建colormap
- 闲谈IPv6-典型特征的一些技术细节
- wps android qq 群,手机WPS怎样发送文档给QQ?WPS怎样发送文档给QQ教程
- 那年大一在图书馆作死的大学高数笔记 | 函数和极限
- 2017/Province_Java_B/3/承压计算
- 17 张程序员壁纸(赶快挑一张吧)
- 使用工厂模式解决设计问题
- IDF实验室-图片里的英语
- 前端学习(2449):发布文章组件
- 计算机ppt文字1是什么原因,ppt让答案一个个出现,ppt让文字一个个出现
- sql配置管理器服务是空的_PostgreSQL 12 安装和配置
- Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例
- code css怎么拿不到div_哈登和威少再怎么努力,也追不上杜兰特,因为刷子是拿不到冠军的...
- 提升 JavaScript 技能的5个小技巧,新手小白值得学习!
- 项目业务工作笔记001---发改委职责
- ubuntu16.04安装pycharm,并设置快捷启动方式
- Python实用笔记 (27)面向对象高级编程——使用枚举类
- VAST2.0视频广告投放解决方案改变视频网站未来技术格局
- 2021年CentOS7安装Oracle11g全记录
- php电子病历毕业设计,基于区块链的电子病历系统设计与实现(自制毕设)
热门文章
- DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution
- 《今日求职》之拉勾网Android客户端产品说明
- 小智-微直播 使用教程
- jieba——分词、添加词典、词性标注、Tokenize
- C++ 脚本解释器cint
- <C++>运算符重载进阶之左移运算符,输出成员属性一步到位
- 使用CSS过滤器让透明的彩色png图像变纯白
- 内网安全 域环境的搭建(模仿真实内网环境 做渗透测试.)
- uWSGI +Flask+torch Cannot re-initialize CUDA in forked subprocess
- 使用 Apache FOP 2.3 + docbook-xsl-ns-1.79.1 转换 Docbook 5.1 格式的 XML 文档成 PDF/RTF 文件