Java—继承和多态 (๑╹◡╹)ノ“““

news2024/9/24 22:18:22

目录:

一、继承:

      为什么面向对象中有继承的概念?那么继承又是什么,继承又有什么作用呢?在我们生活中啊,也存在继承的关系,比如:你父母的财产由你“继承”。那在面向对象中,继承的概念又是什么、又有什么作用呢?咱么往下看:

1、继承的概念:

在看继承的概念之前,咱们先来看几段代码:

           那么继承的机制: 是面向对象里面是代码可以复用的重要手段。它允许在保持原有的类的特性下,进行扩展,增加一些新的功能,这个新的类叫做 派生类/子类,原有的叫做 父类/基类/超类。继承主要解决的是:对于共性的抽取,进而实现复用

比如我上面的Dog和Cat它们是不是都叫做动物,所以得到这样的结果:    继承之后呢,子类可以复用父类的成员,子类只需要关心子类中自己新添加的成员即可。

2、继承的语法:

那么我们知道了继承的概念,但是我们要如何只用代码来进行继承的呢?我们接着往下看:

 通过这个例子,我们可以得出继承的语法如何定义,并且需要用到 extends 关键字。 

修饰符   class 子类/派生类 extends 父类/基类/超类 {                                                                 //代码

}

       这里有一些注意事项:子类在继承父类之后,必须要添加一些自己独有的成员,体现出与父类的不同,否则就没有必要继承类了。

       在上面我们了解了如何继承,那么在子类中呢,是否可以访问父类继承下来的成员呢?那么下面我们来看看,如何实现的。

3、父类成员的访问:

1)、子类中访问父类的成员变量:

(1)、子类与父类不存在同名的成员变量:

在成员变量不同名的情况下,优先访问自己的,自己没有就访问父类的,父类没有就会报错。 

(2)、 子类与父类存在同名的成员变量:

         成员变量的访问,遵循着就近原则,自己有就用自己的,如果没有就访问父类的,但是当父类也没有的时候,就会报错。当,子类与父类同名是时,则优先访问自己的。

         但是呢我们还是想访问父类的成员变量,在同名的情况下,那么我们要如何做到呢?我们需要用到 super关键字 ,不要着急,我们后面马上就会讲解。 

2)、 子类中访问父类的成员方法:

(1)、子类与父类不存在同名的成员方法:

在成员方法不同名的情况下,优先访问自己的,自己没有就访问父类的,父类没有就会报错。

(2)、子类与父类存在同名的成员方法:

   我们可以看到在同名的情况下,优先访问子类的成员变量。还有一种情况:

        在子类和父类方法名相同时,如果父类和子类的同名方法的参数列表不同,也就是发生了重载,根据情况调用,也是在子类中找,没有再在父类中找,再没有就报错。

那么我们接下来就讲解如何在子类和父类的成员同名是,如何在子类中调用父类的成员。

4、super关键字:

    在Java中提供了 super 关键字,该关键字的作用是:在子类中访问父类的成员。

 

注意: 1、super关键字只能在非静态方法中使用。

            2、在子类的方法中,访问父类的成员。

当然对于 super 来说不可能只有只几种用法,咱们在后面再继续扩展 super 的用法。

5、子类的构造方法:

         我们不可能每次都是用创建对象,在引用成员变量来给其赋值,那么我们要如何才能像类一样使用构造方法进行初始化操作呢?直接看代码:

 这样是一种写法,还有一种是默认的构造方法,比如:

   对于 super 的方法必须是在子类构造方法中的第一句。如果不是第一句就会报错:

注意:super(.....)只能在子类构造方法中只能出现一次,并且不能和  this()  同时出现。

6、继承里的代码块执行顺序: 可知步骤:1、先打印父类的静态后打印子类的静态,它们为最先打印,而且只打印一次。

                   2、父类的实例代码块和构造方法。

                   3、子类的实例代码块和构造方法。

 6、protected关键字:

        我们在类和对象当中呢,介绍了 public 、default、private关键字,那么我们今天介绍的是,最后一个访问修饰限定符的关键字:protected。

  我们再开看看这张图,protected是对于不同包的子类,咱们直接看代码:

 

     我们对于访问修饰限定符的使用呢·,不要把所有的;成员变量都设置为 private 所有的成员方法都设置为public, 这是对访问权限的滥用,所以我们在使用是要认真思考是用什么修饰符。

7、继承的方式: 

          对于继承来说呢,有很多的继承方式,比如:单继承、多层继承、不同类继承同一类、多继承(Java不支持多继承)。我们来一一介绍:

1)、单继承: 

单继承是很好理解的,直接看代码就可以知道,就如同它的字面意思一样: 

 2)、多层继承:

3)、不同类继承同一类:

 4)、多继承(Java不支持多继承):

这样会使得类之间的关系变得很复杂。Java中不支持使用多继承。 

我们一般不希望代码出现超过三层的继承关系。 

      当我们写代码的时候,在继承时,我们到一个子类之后不想在被继承了,那么我们用代码要如何实现这个想法呢?在这里呢,我们需要用到的是 final 关键字。

8 、final关键字:

    final关键字可以用来修饰变量、方法和类。

 1)、final修饰变量:

    可知:被 final 修饰的变量,会变成常量,不可再修改。 

2)、final修饰方法: 

表示该方法不可被重写,这个问题,我们会在后面进行讲解。 

3)、final修饰类:

 

被 final 修饰的类不会再被继承。 

9、继承与组合:

 继承与对象之间是 is-a 的关系。

 组合与对象之间是 has-a 的关系。

继承与对象我们了解了,那么组合和对象又是什么呢?我们来举一个例子:比如电脑。

看代码:

组合是将一个类的实例作为另一个类的字段。


二、多态:

1、多态的概念:

      概念:就是当去完成某个动作时呢,不同的对象会有不同状态,就称为多态。

    比如呢:对于吃东西这个动作,对于小狗来说是吃狗粮,对于小猫来说是吃猫粮。 这就产生了多态。

2、实现多态的条件:

  1、必须要在继承的条件下。

  2、子类必须要重写父类的方法。

  3、需要用父类进行引用来调用重写的方法。

咱们来看一个例子:

          这里面呢有很多的知识点,我们接下来再一一讲解,相信讲完之后呢,就会对于这个代码有了很大的了解了 。

首先咱们来看重写

 3、重写:

构成重写的条件是:1、方法名相同。

                                 2、返回值相同。 

                                 3、参数列表一致。

但是对子类重写父类的方法的时候,被重写的方法的返回值可以不同,但是必须构成父子关系。

还有对于访问修饰限定符来说子类的访问修饰限定符不能低于父类的。

注意的是当父类被private 和 static修饰的时候呢,不能被重写。

1)、静态绑定:

  在编译时,根据用户所传递的实参类型就确定了具体调用哪个方法。比如重载。

2)、动态绑定:

 在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。


4、向上转型和向下转型:

1)、向上转型:

   就是创建一个子类对象,当成其父类对象来使用。

父类类型  对象名 = new 子类类型;

 有三种方法:

1、直接赋值:

2、方法的传参: 

3、作为方法的返回值:

 向上转型的优点:可以使代码更加的灵活。

 向上转型的缺点:不能使用子类的方法。

2)、向下转型: 

        在我们向上转型之后呢,我们就无法使用子类的方法了,但是呢有时候我们在向上转型之后呢,又想使用子类的方法,那这时候就需要用到,向下转型,就是把父类转成子类。 

       但是呢,向下转型是一个不安全的动作,比如:你的Animal由Dog类向上转型,当你向下转型的时候,你给转到Cat类,就是不对的,会报错。

那么我们要如何去向下转型呢?看代码:

           那么我们要如何避免这种情况的发生呢?这时Java中引入了一个关键字:instanceof 这个关键字的表达式为boolean类型,咱们再看看如何使用的:

5、多态的优缺点:

1、可以避免大量的使用 if—else 语句:

        在没有学习多态时,要实现这种代码需要用到很多的 if—else 语句。我们学习多态后可以变成这种写法:

2、可扩展能力变强。

缺点:

   会是代码运行效率降低。


 

总结:

  这次的继承与多态就结束了,下次我们开始介绍接口了,那么让我们期待下次的相遇,拜拜~~ 

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

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

相关文章

vxe-pulldown 设置了宽度,并不能100%的占满整个容器的解决

1、下拉容器的使用 2、然而,这个宽度的显示是个问题,只占了一小部分: 长度并没有充满整个容器。 vxe-input设置了100%,然后也是一样的效果。 3、解决: .vxe-pulldown {width: 100% !important;} 增加上面的样式&…

本地GitLab runner自动编译Airoha项目

0 Preface/Foreword 1 GitLab runner环境 具体情况如下: Gitlab-ruuner运行在wsl 1中的Ubuntu 18.04 distro上专门为GitLab-runner分配了一个用户,名为gitlab-runner 2 自动编译 2.1 Permission denied 编译过程中,有两个文件出现权限不允…

Java语言程序设计基础篇_编程练习题*16.4 (创建一个英里/公里的转换器)

目录 *16.4 (创建一个英里/公里的转换器) 代码示例 结果展示 *16.4 (创建一个英里/公里的转换器) 编写一个程序来转换英里和公里,如图16-37b所示。如果在英里文本域Mile中输入一个值之后按下回车键,就会在公里文本域公里值。同样的,在公里文…

Latex入门指南:从下载到安装的全面教程

本篇博客旨在为初学者提供一个全面的Latex入门指南,涵盖了从下载、安装到配置Texlive和TexStudio的详细步骤。通过本指南,您将了解到如何正确安装Latex环境并成功运行第一个Latex文档,为撰写高质量的科技论文或书籍打下坚实基础。 目录 一定…

因为不懂ESLint,我被公司开除了……

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我…

把握现货黄金价格走势与买入时机 这两点缺一不可

在现货黄金投资中,对黄金价格走势的分析和做交易(买入卖出),这些动作之间是相关联的,而且联系很大,比方说投资者如果没有对现货黄金价格走势做正确有效的分析,那他可能在一些交易中获得盈利&…

【附PDF】《大模型应用开发 动手做 AI Agent》,第一本给程序员看的AI Agent图书!

AI Agent火爆到什么程度? OpenAI创始人奥特曼预测,未来各行各业,每一个人都可以拥有一个AI Agent;比尔盖茨在2023年层预言:AI Agent将彻底改变人机交互方式,并颠覆整个软件行业;吴恩达教授在AI …

隧道通风网络节点图导出CAD文本时的三角形算法

在TESP软件中涉及到将带文本的节点图导出为CAD文件,其中文本的绘制需要根据Section的方向来确定,确保和绘图的习惯一致。具体包括: (1)垂直绘制的Section需确保文字字头向左。 (2)除了垂直的文…

Golang面试题三(map)

1.map底层实现 由图看出,其实map的底层结构体是hmap,同时hmap里面维护着若干个bucket数组(即桶数组)。bucket数组中每个元素都是bmap结构的,bmap中存储着8个key-value的键值对,如果是满了的话,当…

奥运会Ⅵ--LLM 是否狡猾到可以自行欺骗你?

这已经成为一句老生常谈,因为它是事实:人类开发的任何工具都可以用于行善或作恶。你可以用锤子敲钉子或砸某人的头。你可以用火取暖或烧毁房屋。等等。 因此,数字世界的最新工具既带来好处,也带来风险,这不足为奇。其…

文献解读-遗传病-第二十六期|《癫痫的临床特征、诊疗和KCNH5突变》

关键词:遗传病;基因测序;变异检测; 文献简介 标题(英文):Clinical Feature, Treatment, and KCNH5 Mutations in Epilepsy标题(中文):癫痫的临床特征、诊疗和…

文心一言 VS 讯飞星火 VS chatgpt (318)-- 算法导论22.3 10题

十、修改深度优先搜索的伪代码,让其打印出有向图G的每条边及其分类。并指出,如果图G是无向图,要进行何种修改才能达到相同的效果。如果要写代码,请用go语言。 文心一言: 首先,我们来定义深度优先搜索&…

leetcode:汇总区间

题目: 给定一个无重复元素的有序整数数组nums。返回恰好覆盖数组中所有数字的最小有序区间范围列表 。也就是说,nums的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于nums的数字X。列表中的每个区间范围[a,b]应该按…

简单的docker学习 第2章 docker引擎

第2章docker引擎 2.1Docker 引擎发展历程 2.1.1 首发版本架构 Docker 在首次发布时,其引擎由两个核心组件构成:LXC(Linux Container)与 Docker Daemon。不过,该架构依赖于 LXC,使得 Docker 存在严重的问…

人力资源杂志人力资源杂志社人力资源编辑部2024年第13期目录

看法_总编随笔 学会退步 齐向宇; 1 看法_热点聚焦 数说 7 司事 9 看法_热点聚焦_翻转 话题 “霸总”发言遭吐槽对职场年轻人多些体谅 8 看法_视界《人力资源》投稿:cn7kantougao163.com 养老保险改革及其对人事工作的启示 赵梓安; 12-13 做…

潘展乐速度!滴滴无车赔,叫车就是快

8月5日,滴滴网约车“快”乐大使潘展乐在男子4x100米混合泳接力比赛中以45秒92的优异成绩在最后一棒反超,中国队夺得金牌!恭喜潘展乐在本届比赛中和队友一起站上冠军的领奖台,用团队金牌为自己庆生! 为进一步提升用户叫…

三级等保测评如何顺利通过

三级等保认证,作为中国信息安全等级保护制度中的高级别认证,其标准之高、要求之严,在国内信息安全领域内堪称顶尖。根据《信息系统安全等级保护基本要求》,三级等保的测评内容覆盖了等级保护安全技术要求和安全管理要求的多个层面…

android13 删除兼容性警告窗口 deprecation warning 去除弃用警告

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况 3.问题分析 4.代码更改 5.编译测试 6.彩蛋 1.前言 在 Android 13 中,为了提高用户体验和应用的兼容性,系统引入了一些新的隐私和安全特性。这些特性可能会影响旧版应用的行为,因此当用户运行可能不完全兼容 An…

【HarmonyOS NEXT星河版开发学习】小型测试案例01-今日头条置顶练习

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面 ​ 前言 本系列可能是博客首发,鸿蒙开发星河版是一个全新的版本,由于参考视频较少鸿蒙开发不被重视导致csdn上面并没有全套的学习路线,…

6款免费版文章生成器,为你的创作提供无限可能

在这个信息发展迅速的时代,创作者们常常陷入时间和灵感的困境中。为了应对这一挑战,人工智能技术为我们提供了一种全新的解决方案——文章生成器。在这些文章生成器中可以帮助我们快速生成高质量的内容,为我们的创作提供无限可能。在本文中&a…