浅谈面向对象--多态

news2024/11/17 1:26:05

接口    


接口概述


我们要完成一个工程,需要一个插座
思考1:去市场买个回来!=> 市场上有公牛、小米... => 小米和公牛认识吗?什么原因导致公牛和小米的插座我都可以用
接口是一种约定的规范,是多个抽象方法的集合(抽象方法的?)。仅仅只是定义了应该有哪些功能,本身不实现功能,至于每个功能具体怎么实现,就交给实现类完成。
接口中的方法是抽象方法,并不提供功能实现,体现了规范和实现相分离的思想,也体现了组件之间低耦合的思想。
所谓耦合度,表示组件之间的依赖关系。依赖关系越多,耦合性越强,同时表明组件的独立性越差,在开发中往往提倡降低耦合性,可提高其组件独立性,举一个低耦合的例子。
电脑的显卡分为集成显卡和独立显卡:
  集成显卡:显卡和主板焊死在一起,显卡坏了,只能换主板
  独立显卡:显卡和主板相分离,显卡插到主板上即可,显卡坏了,只换显卡,不用换主板
接口也体现的是这种低耦合思想(在开发过程中,如果想要解耦,一定要想到接口),接口仅仅提供方法的定义,却不提供方法的代码实现。那么得专门提供类并去实现接口,再覆盖接口中的方法,最后实现方法的功能,在多态案例中再说明。

接口定义和多继承性


接口可以认为是一种特殊的类,但是定义类的时候使用class关键字,定义接口使用interface关键字。

接口表示具有某些功能的事物,接口名使用名词,有人也习惯以I打头如IWalkable.java。


在java中,接口也可以继承,一个接口可以继承多个接口,也就是说一个接口可以同时继承多个接口,如两栖动物可以行走也可以拥有。


两栖动物规范,即可以游泳,又可以行走。

此时子接口能继承所有父接口的方法。

接口实现类


[1]. 因为接口中的方法是抽象的,没有方法体,所以接口是不能创建对象的,此时必须定义一个类去实现接口,并覆盖接口中的方法,这个类称之为实现类,实现类和接口之间的关系称之为实现关系
(implements)。

实现类实现接口后,必须实现接口中的所有抽象方法,完成功能代码,此时接口和实现类之间的关系:   接口:定义多个抽象方法,仅仅定义有哪些功能,却不提供实现。
  实现类:实现接口,实现接口中抽象方法,完成功能具体的实现。
如果实现类没有全部实现接口中的方法,要么报错,要么把实现类设置为抽象类。

需求  :定义一个猫类(Cat)实现IWalkable接口,并创建对象调用方法。

public class Cat implements IWalkable{

public void walk() { System.out.println("走猫步...");

}

}

根据方法覆盖原则:子类方法的访问修饰符必须大于等于父类方法的访问修饰符,接口中的方法都是

public class Person implements ISwimable, IWalkable { @Override

public void walk() { System.out.println("人类步行...");

}

@Override

public void swim() { System.out.println("人类游泳...");

}

}

public修饰的,所以实现类中的方法只能使用public修饰。需求:定义一个人类,实现ISwimable,IWalkable接口
总结 : 实现类实现了接口,一定具备接口中定义的能力。

[2]、实现类可以继承父类,可以同时实现一个或多个接口,继承在前,实现在后。
定义一个青蛙类(Frog)继承于动物类(Animal),同时实现于会走路(IWalkable),会游泳
(ISwimable)的接口,语法如下(记住定义语法即可):

public class Frog extends Animal implements ISwimable,IWalkable{

public void walk() { System.out.println("跳啊跳...");

}

public void swim() { System.out.println("游啊游..");

}

}

[3]、接口是一种引用数据类型,可以用来声明变量,并接收(引用)所有该接口的实现类对象。如果要创建实现类对象,语法如下:

接口 变量 = new 实现类();


接口总结


  接口表示一种规约(规范、标准),它里面定义了一系列抽象方法(功能),它可以被多个类实现。
  实现类实现接口,必须实现接口中的所有抽象方法。我们经常说:接口约定了实现类应该具备的能力。


多态  

多态概念

在继承关系,即什么是什么 ,也就说子类是父类的一种特殊情况,有如下代

例如:如果Student 继承于 Person,我们就可以说,学生 is a 人类

那么我们可以认为狗和猫都是一种特殊的动物,那么可以使用动物类型来表示狗或猫。

Dog    d    =    new Dog();    //创建一只狗对象,赋给子类类型变量
Animal    a    =    new Cat();    //创建一只猫对象,赋给父类类型变量

此时对象(a)具有两种类型:
 编译时类型:声明对象变量的类型——>Animal  运行时类型:对象的真实类型 ——>new Dog
当编译类型和运行类型不一致的时候,此时多态就产生了:注意:编译类型必须是运行类型的父类或接口。

所谓多态,简单地理解 , 表示一个对象具有多种形态。

说的具体点就是同一引用类型变量调用同一方法时,由于引用实例不同,方法产生的结果不同。
多态的前提,可以是继承关系(父类和子类),也可以是实现关系(接口和实现类),在开发中,一般都指接口和实现类之间的关系。
一言以蔽之 ( 以继承关系为例 ):父类引用变量指向于子类对象,调用方法时实际调用的是子类的方法。

我家有一种动物,你猜它的叫声是怎么样的,猜不到,因为这个动物有多种形态。   如果该动物是狗,叫声是:旺旺旺...
  如果该动物是猫,叫声是:妙妙妙...
多态操作有两种定义格式和操作语法:
  操作继承关系(开发中不是很多):

父类 变量名 = new 子类();

变量名.方法();

操作实现关系(开发中最频繁):

接口 变量名 = new 实现类();

变量名.方法();


操作继承关系

结论:父类引用变量指向于子类对象,调用方法时实际调用的是子类的方法。

操作实现关系

结论:接口引用变量指向实现类对象,调用方法时实际调用的是实现类实现接口的方法。

多态时方法调用问题


把子类对象赋给父类变量,此时调用方法:

那么 animal 对象调用的shout方法,是来自于Animal中还是Cat中?判断规则如下:一张图,看懂到底调用的是哪一个类中的方法!


文字解释,先判断shout方法是否在父类Animal类中:
 找不到:编译报错
 找    到:再看shut方法是否在子类Cat类中:  找不到:运行父类方法
 找    到:运行子类方法(这个才是真正的多态方法调用)


多态小结


类型转换


自动类型转换:把子类对象赋给父类变量(多态)

强制类型转换:把父类类型对象赋给子类类型变量。

(前提:该对象的真实类型应该是子类类型),在实际开发过程中,如果需要调用子类特有的方法时,一定要进行强制类型转换。

instanceOf


instanceof  运算符:判断该对象是否是某一个类/父类/接口的实例,在开发中运用不是很多


代码如下:

语法格式:

boolean b = 对象A instanceof 类B; //判断 A对象是否是 B类的实例?如果是,返回true

多态的好处 - USB案例


需求:模拟在主板上安装鼠标、键盘等,比较没有规范和有规范的区别。没有统一规范:
鼠标类:

键盘类:

主板类:


上述代码是没有统一规范的,我们能发现其中的问题:  不同设备中工作的方法名称是不一致的
  每次需要安装新设备,都需要在主板类上新增一个方法(这个问题严重)
有统一规范:
USB规范接口:

在Mouse和Keyboard类遵循于USB规范——工作的方法名称也就相同了。

主板类,在安装方法plugin上也体现出了多态的特征:

面向接口编程,体现的就是多态,其好处:把实现类对象赋给接口类型变量,屏蔽了不同实现类之间的实现差异,从而可以做到通用编程。

测试类,无论是否使用多态,测试代码相同:

请问:使用USB接口后,哪里出现多态了?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1684285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于网络爬虫技术的网络新闻分析(四)

目录 4.2 系统异常处理 4.2.1 爬虫异常总体概况 4.2.2 爬虫访问网页被拒绝 5 软件测试 5.1 白盒测试 5.1.1 爬虫系统测试结果 5.1.2 中文分词系统测试结果 5.1.3 中文文章相似度匹配系统测试结果 5.1.4 相似新闻趋势展示系统测试结果 5.2 黑盒测试 5.2.1 爬虫系统测…

【每日刷题】Day47

【每日刷题】Day47 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 112. 路径总和 - 力扣(LeetCode) 2. 2404. 出现最频繁的偶数元素 - 力扣&am…

PPT图片高清导出

PPT制作的图片高清导出 适用于windows系统 案例 例如想要导出下面这张图片 1. 保存为emf文件 2. 将emf文件导入画图软件 导入方法直接将emf文件拖进去就行,可以看到图片成功高清显示(可以通过放缩检查是否模糊)。 3. 修改分辨率 点击上方…

Redis协议的请求和响应有哪些“套路”可循?no.18

Redis 协议 Redis 支持 8 种核心数据结构,每种数据结构都有一系列的操作指令,除此之外,Redis 还有事务、集群、发布订阅、脚本等一系列相关的指令。为了方便以一种统一的风格和原则来设计和使用这些指令,Redis 设计了 RESP&#…

适用于Windows 电脑的最佳视频恢复软件和方法

毫无疑问,丢失您的基本数据总是有压力的,尤其是当这些是您为捕捉最美好回忆而收集的重要视频文件时。要恢复丢失或损坏的视频文件,您可以借助视频恢复工具。但是,在选择最佳视频恢复工具时,您必须考虑多个扫描选项&…

Linux .eh_frame section以及libunwind

文章目录 前言一、LSB二、The .eh_frame section2.1 简介2.2 The Common Information Entry Format2.1.1 Augmentation String Format 2.3 The Frame Description Entry Format 三、The .eh_frame_hdr section四、libunwind五、基于Frame Pointer和基于unwind 形式的栈回溯比较…

紫光展锐突破创新终端品类,搭载展锐芯的全球首款二合一5G云电脑正式发布

近日,搭载紫光展锐5G芯片T760的中兴云电脑逍遥系列正式发布,亮点: 全球首款二合一5G云电脑,支持本地/云端双模式,一键切换,用户可同时享有Android平板和Windows云电脑两种形态;支持5G蜂窝网络&…

LLama3 | 一. 本地 Web Demo 部署

前置工作 课程文档:Llama3-Tutorial/docs/hello_world.md at main SmartFlowAI/Llama3-Tutorial GitHub 1.安装vscode 2.安装vscode插件 Remote SSH 3.配置 VSCode 远程连接开发机 ssh连接开发机 进行端口映射 在开发机控制台中点击自定义服务,复…

DeepDriving | CUDA编程-02: 初识CUDA编程

本文来源公众号“DeepDriving”,仅用于学术分享,侵权删,干货满满。 原文链接:CUDA编程-02: 初识CUDA编程 上一篇文章DeepDriving | CUDA编程-01: 搭建CUDA编程环境-CSDN博客介绍了如何搭建CUDA编程环境&a…

阿里云数据库 SelectDB 版全面商业化,开启现代化实时数据仓库的全新篇章

2024 年 5 月 21 日,由阿里云联合飞轮科技共同举办的「阿里云数据库 SelectDB 版商业化产品发布会」于线上召开。阿里巴巴集团副总裁、阿里云数据库产品事业部负责人李飞飞宣布,阿里云数据库 SelectDB 版在中国站及国际站全面发布,正式开启商…

5. JVM面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 说一下JVM的主要组成部分及其作用? JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 Cl…

Kibanna安装配置

环境:windows10、ES(8.13.3)、Kibana(8.13.3)、Logstash(8.13.3) 1.Kibanna安装配置 Kibanna对ES的数据进行可视化、分析和监控 Download Kibana Free | Get Started Now | ElasticDownload K…

零部件销售|基于SSM+vue的轻型卡车零部件销售平台系统的设计与实现(源码+数据库+文档)

轻型卡车零部件销售平台 目录 基于SSM+vue的轻型卡车零部件销售平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

MavLinK协议

由于在公司需要使用这个,我就写一个文章用于入门级别 简单介绍 MAVSDK是PX4开源团队贡献的基于mavlink通信协议的用于无人机应用开发的SDK,其可以部署在Windows、Linux、Android等多种平台,并且支持多种语言如c/c、python、Java等。 在官网…

5月30日在线研讨会 | 面向智能网联汽车的产教融合解决方案

随着智能网联汽车技术的快速发展,产业对高素质技术技能人才的需求日益增长。为了促进智能网联汽车行业的健康发展,推动教育链、人才链与产业链、创新链的深度融合,经纬恒润推出产教融合相关方案,旨在通过促进教育链与产业链的深度…

XV4001KD汽车级应用的数字输出陀螺传感器

XV4001KD是一款专为汽车导航系统和远程信息处理而设计的数字输出陀螺传感器。采用SPI/I2C串行接口,具有高精度的16位的角速率输出和11位的温度输出功能,能够准确地测量车辆的运动状态和环境温度,为导航系统和信息处理提供可靠的数据支持。以及…

深度学习基础之《TensorFlow框架(18)—卷积神经网络(2)》

一、卷积层 1、卷积层(Convolutional Layer)介绍 卷积神经网络中每层卷积层由若干卷积单元(卷积核)组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的 卷积运算的目的是特征提取,第一层卷积层可能…

word页眉线如何置于文字上方

然后 敲黑板,点这里

学硕都考11408的211院校!河北工业大学计算机考研考情分析!

河北工业大学(Hebei University of Technology),简称河北工大,坐落于天津市,由河北省人民政府、天津市人民政府与中华人民共和国教育部共建, 隶属于河北省,是国家“双一流”建设高校、国家“211…

Linux磁盘高级操作

RAID RAID存储系统是一种数据存储虚拟化技术,它将多个物理磁盘驱动器组合成一个或多个逻辑单元,以提供数据冗余和/或提高性能。 1. RAID 0 无奇偶校验与冗余(磁盘容错)的条带存储(带区卷/条带卷) 由两块…