当前位置: 首页 > ai >正文

继承【Java版】详细讲解

一、使用继承的原因

       在代码编写的过程当中,往往会出现大量代码重复的问题,导致代码非常冗余,继承就是很好的处理了这样的问题,将每一个类当中重复的部分进行抽取,封装最终达到代码的复用。

二、继承的具体使用

如果他的关系是一个is a的关系;就可以使用继承的方式

1.两个类相互影响的条件

小狗的类(相关性质):

小猫的类(相关性质):

从上述可以看到,有部分是重复的,这部分都是满足动物的特性的;

所以可以将这一部分抽取出来,从而让之后的动物继承这部分实现代码的复用:

2.单独提取

需要使用到一个关键字:extends

这两个部分都是满足动物的属性的,所以可以进行抽取将这部分放在动物这一个类当中

整体的代码就如上述图片所示

此时的这个关系叫做继承;

重点词汇讲解:

cat/dog:相当于是子类/派生类

animal:相当于是父类/基类/超类

(有些东西是可以不用重复书写的)

注意事情:建议的是一个java文件当中只有一个类;会使代码更加清晰

三、细节

父类与子类之间的成员变量,成员方法以及抽取出来之后怎样进行的区分,怎样进行的正确的打印

我们新建一个类进行测试:

此时我们可以看到这两个当中的变量是没有任何冲突的,所以之间是直接可以不影响相互进行访问的

1.子类当中怎样访问父类的方法——直接进行访问

最终是可以直接进行打印的

对上述代码的解释;为什么可以打印出来那样的结果——堆栈图;

上面的两个是从父类当中继承过来的

下面的是是自己的

2.子类当中有与父类同名的变量

增加了一个a变量,最终的结果为:

打印的是子类自己的结果(体现的是就近原则)

总结:当父类与子类有相同的变量时,就会使用的是子类自己的值:

那怎样可以访问父类的值使用supper关键字

3. 如果方法之间父类与子类的方法名称相同(构成了重载)

如果在调用时,传的是char数据则会调用的就是父类的方法;如果没有就是子类的(都是相同的,根据参数进行匹配)——方法也是符合的就近原则

如果就是想要访问父类的方法,也是相同的,采用super的操作进行访问

继承是可以一直继承的,但是super只能指代当前类的父类,不能指代父类的父类

super

有三种用法:

1.代表父类的成员变量

2.代表父类的方法

3.构造方法中的使用(帮助调用父类的构造方法)

所以此时就会打印出来父类的值

所以就是可以认为整体上是this,但是同名就是优先自己

但是如果都没有,就会发生编译错误

this与super只能在非静态的方法才可以使用(super与this是依靠类来存在的)

重点讲解第三种:构造方法当中的使用(在构造方法中必须要在第一行)

当父类有构造方法后,子类一定要有构造方法

父类当中使用构造方法,Animal中一个;

但是为什么?

当子类继承父类之后,子类需要显示的调用父类的构造方法,要先帮助父类的成员进行初始化;

所以必须显示的调用父类构造方法,所以此时super的作用:调用了父类当中的构造方法

换句话说;super()与this()是不能共存的

如果说在没有构造方法的时候:编译器是会自己进行提供的;只要写了任何构造方法,编译器都不会进行提供

注意:

1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法

2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。

3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。

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

http://www.xdnf.cn/news/3676.html

相关文章:

  • 虚幻引擎入门笔记
  • 山东大学计算机组成与设计第七章习题解析
  • Nginx — 防盗链配置
  • 深度学习核心架构:探明四种基础神经网络
  • 从基础到实践(三十六):RTC时钟芯片的应用
  • 多线程系列三:这就是线程的状态?
  • 什么是生成式 AI (GenAI)?
  • 强化学习--2.数学
  • 摩尔缠论课程合集完整版核心课程前置课程圈子问答星球圈子摩尔缠论三个阶段
  • redis延时队列详细介绍
  • Dart和Go语言特征对比
  • 接上篇,解决FramePack启动报错:“httpx.ReadError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。“的问题
  • 关于项目中优化使用ConcurrentHashMap来存储锁对象
  • 【C语言练习】019. 使用结构体数组存储复杂数据
  • 【unity游戏开发入门到精通——UGUI】整体控制一个UGUI面板的淡入淡出——CanvasGroup画布组组件的使用
  • 基于D-Mixer与TransXNet的YOLOv8改进—融合全局-局部特征与空间降维注意力机制的CNN-ViT混合架构
  • 三、shell脚本--运算符与表达式:让脚本学会“思考”
  • 高中数学联赛模拟试题精选学数学系列第4套几何题
  • 数据的存储
  • Python表达式全解析:从基础到高级
  • 开源项目实战学习之YOLO11:ultralytics-cfg-models-nas(十)
  • C++的内存
  • 深入探索 AAC 编码原理与 ADTS 格式:音频世界的智慧结晶
  • PCIe | TLP 报头 / 包格式 / 地址转换 / 配置空间 / 寄存器 / 配置类型
  • 第二章:一致性基础 A Primer on Memory Consistency and Cache Coherence - 2nd Edition
  • 线程互斥与同步(上)
  • 2025年渗透测试面试题总结-拷打题库36(题目+回答)
  • Python Cookbook-6.18 用__init__参数自动初始化实例变量
  • 多端定制系统开发:打造高效全平台覆盖的APP解决方案
  • Python爬虫(16)Python爬虫数据存储新维度:Redis Edge近端计算赋能实时数据处理革命