Java篇之继承

目录

一. 继承

1. 为什么需要继承 

2. 继承的概念

3. 继承的语法

 4. 访问父类成员

4.1 子类中访问父类的成员变量

4.2 子类中访问父类的成员方法

5. super关键字

6. super和this关键字

 7. 子类构造方法

8. 代码块的执行顺序

 9. protected访问修饰限定符

10. 继承方式

11.final关键字

12. 继承与组合

结语


一. 继承

1. 为什么需要继承 

在Java中类是对现实生活中一组对象的抽象描述,是创建对象的模板,经过实例化后的对象可以用来表示现实中的实体,但是我们可以发现很多事物是存在一些关联的,比如:永劫无间中的治疗型英雄和进攻性英雄、他们都是英雄角色

 用我们的Java语言该如何实例化一个永劫无间中的英雄对象呢

public class Therapeutic {//治疗型
    public String name ;//表示名字
    public int age;//表示年龄
    public int HP;//表示血量

    public Therapeutic(String name, int age, int HP) {
        this.name = name;
        this.age = age;
        this.HP = HP;
    }

    public void run(){
        System.out.println(this.name +"正在跑...");
    }
    public void used_Treatskill()
    {
        System.out.println(this.name+"使用了治疗技能...");
    }
}



public class Offensive {//进攻型
    public String name ;//表示名字
    public int age;//表示年龄
    public int HP;//表示血量

    public Offensive(String name, int age, int HP) {
        this.name = name;
        this.age = age;
        this.HP = HP;
    }

    public void run(){
        System.out.println(this.name +"正在跑...");
    }
    public void used_Offensive_skill()
    {
        System.out.println(this.name+"使用了进攻技能...");
    }
}


通过上述代码我们可以发现,在我们的进攻型英雄和治疗型英雄的中存在大量的重复代码,如图所示:

那么有什么办法能够将这些共性抽取,来减少代码的冗余和增加代码的复用性呢?那么在我们面向对象的思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用

2. 继承的概念

在Java中,继承是面向对象编程的重要特性之一,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而减少代码的冗余和实现代码的复用,继承主要解决的问题就是:共性的抽取,实现代码复用。

例如上述说的:治疗型英雄和进攻型英雄都是英雄人物,那么我们可以将共性的内容进行抽取。

3. 继承的语法

在实现上述例子继承关系之前,我们先来学习一下继承的语法。在Java中要实现类之间的继承关系,我们需要借助extends关键字:

修饰符 class 子类 extends 父类 {
    内容
    // ... 
}

那么对于上述例子我们就可以重新设计:

//英雄类
public class Heroic_Characters {
    public String name ;//表示名字
    public int age;//表示年龄
    public int HP;//表示血量

    public Heroic_Characters(String name, int age, int HP) {
        this.name = name;
        this.age = age;
        this.HP = HP;
    }

    public void run(){
        System.out.println(this.name +"正在跑...");
    }
}

//治疗型英雄类
public class Therapeutic extends Heroic_Characters {

    public Therapeutic(String name, int age, int HP) {
        super(name, age, HP);
    }//治疗型

    public void used_Treatskill()
    {
        System.out.println(this.name+"使用了治疗技能...");
    }
}
//进攻型英雄类
public class Offensive extends Heroic_Characters{

    public Offensive(String name, int age, int HP) {
        super(name, age, HP);
    }//进攻型

    public void used_Offensive_skill()
    {
        System.out.println(this.name+"使用了进攻技能...");
    }
}
  • 继承后。子类会继承父类中的成员变量和成员方法
  • 如果子类和父类的成员变量、成员属性都相同。那么继承就变得没有意义,所以子类继承父类后,需要有自己特有的成员或者方法,体现出与父类的不同。

 4. 访问父类成员

子类继承父类之后,在子类中我们能否直接访问从父类继承下来的成员呢?

此时我们分为两种情况:

  1. 子类中访问父类的成员变量               
    1. 子类和父类中不存在同名的成员变量
    2. 子类和父类中存在同名的成员变量
  2. 子类访问父类中的成员方法
    1. 成员方法名字不同
    2. 成员方法名字相同

4.1 子类中访问父类的成员变量

1.子类和父类中不存在同名的成员变量

2.子类和父类中存在同名的成员变量

 

总结:在子类访问成员变量时,如果访问的成员变量在子类中存在,那么优先访问子类自己的成员变量,如果子类没有再去父类中找,如果子类和父类都没有,那么就会报错。

4.2 子类中访问父类的成员方法

 1.成员方法名字不同

2.成员方法名字相同

总结:当子类成员方法和父类成员方法名字相同时,优先从子类中找,如果子类没有就去父类找。都找不到则进行报错处理。

 那么如果我想在子类和父类成员变量或成员方法相同的情况下,访问父类的成员该怎么办呢?

5. super关键字

当我想实现上述的情况时,这时候就要引入Java中提供的关键字super来解决:该关键字的作用就是在子类方法中访问父类的成员。

 在子类方法中,想要明确访问父类中的成员变量和方法,借助super关键字就好啦,但是super只能在非静态方法中使用。

6. super和this关键字

相同点不同点
super

1. 都是Java中的关键字

2. 只能在非静态方法中使用,访问非静态的成员

3.在构造方法中调用时,必须是第一条语句

1.this表示的是当前对象的引用,supe表示的是从父类继承下来的部分成员的引用

2. 在非静态成员方法中, this 用来访问本类的方法和属性, super 用来访问父类继承下来的方法和属性
3. 在构造方法中: this( ) 用于调用本类构造方法, super( ) 用于调用父类构造方法,两种调用不能同时在构造 方法中出现
4. 构造方法中一定会存在 super(...) 的调用,用户没有写编译器也会增加,但是 this(...) 用户不写则没有
this

 7. 子类构造方法

当我们子类对象构造的时候,我们会先调用父类的构造方法,先构造父类对象再执行子类的构造方法:

 那么为什么会出现这样情况呢?

子类对象中成员是有两部分组成的,父类继承下来的以及子类新增加的部分 。父子父子肯定是先有父再有子,那么在构造子类对象时候 ,先要调用父类的构造方法,将从父类继承下来的成员构造完整 ,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整。

这里有个注意事项:

1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有 隐含的super() 调用,即调用父类构造方法
2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败

 

8. 代码块的执行顺序

代码块分为几个重要的代码块:实例代码块静态代码块那么在有继承关系的时候,这几个代码块的执行顺序是怎么样的呢?

 通过运行结果我们就可以知道,代码块的执行顺序是:父类静态代码块 --> 子类静态代码块 --> 父类实例代码块 --> 父类构造方法 --> 子类实例代码块 --> 子类构造方法

注意:当第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行:

 9. protected访问修饰限定符

为了实现封装特性, Java 中引入了访问限定符,主要限定:类或者类中成员能否在类外或者其
他包中被访问。

 1. 被public修饰

此时的Dog类和Main类在不同的包底下并且不是继承关系,但是在Main类中任然能够访问Dog类中的成员变量 ,所以public的权限是最广的。

2. 被protected修饰

此时的Dog类和Main类在不同的包底下是继承关系,在Main类中能够访问Dog类中的成员变量 ,那么这就是protected访问修饰符的权限(不同包有继承关系的类能够访问),如果不继承的话:

就会像上图中一样发生报错。这里有一个很重要的注意事项:

被protected修饰,可以访问不同包的有继承关系的类,但是访问的时候我们是需要通过new子类对象来进行访问的,直接new父类对象是访问不了的

10. 继承方式

在我们的Java中只支持单继承、多层继承、不同类继承同一个类,但是不支持多继承:

(1)单继承

这种一个类只继承另一个类的继承方式叫做单继承。

(2)多层继承

 这种一个类继承另一个类,此时又有一个类继承该类的继承方式叫做多继承

(3)不同类继承同一个类

此时狗类和猫类都继承Animal这个类

注意:一个类是不能继承多个类的,也就是所谓的多继承~是不存在的

11.final关键字

一般我们不希望出现超过三层的继承关系, 如果继承层 次太多, 就需要考虑对代码进行重构了,  如果想从语法上进行限制继承, 就可以使用 final 关键字,final关键字有三种使用方式:可以修饰变量、可以修饰成员方法、可以修饰类。
(1)修饰变量

当我们用final修饰变量的时候,就具备了常量的属性,此时变量的值是不能进行修改的

(2)修饰成员方法

当我们的成员方法被final修饰,此时的成员方法是不能被重写的

(3)修饰类

 当类被final修饰,说明当前类是不能被继承的

12. 继承与组合

组合和继承类似 , 组合也是一种表达类之间关系的方式 , 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法(诸如 extends 这样的关键字 ), 仅仅是将一个类的实例作为另外一个类的字段。
继承表示对象之间是 is-a 的关系 ,比如:狗是动物,猫是动物.....
组合表示对象之间是 has-a 的关系 ,比如:水果篮中有苹果、香蕉.....
用代码实现一个组合:

 那么此时这种表达类之间关系的方式就是一种组合~

结语

那么以上就是本期Java继承的全部内容啦~希望大家收获满满,在此感谢大家的观看!!!

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sobel边缘检测算法

人工智能例子汇总:AI常见的算法和例子-CSDN博客 Sobel边缘检测算法是一种用于图像处理中的边缘检测方法,它能够突出图像中灰度变化剧烈的地方,也就是边缘。该算法通过计算图像在水平方向和垂直方向上的梯度来检测边缘,梯度值越大…

MySQL为什么默认引擎是InnoDB ?

大家好,我是锋哥。今天分享关于【MySQL为什么默认引擎是InnoDB ?】面试题。希望对大家有帮助; MySQL为什么默认引擎是InnoDB ? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 默认引擎是 InnoDB,主要…

【Pytorch和Keras】使用transformer库进行图像分类

目录 一、环境准备二、基于Pytorch的预训练模型1、准备数据集2、加载预训练模型3、 使用pytorch进行模型构建 三、基于keras的预训练模型四、模型测试五、参考 现在大多数的模型都会上传到huggface平台进行统一的管理,transformer库能关联到huggface中对应的模型&am…

c语言进阶(简单的函数 数组 指针 预处理 文件 结构体)

c语言补充 格式 void函数头 {} 中的是函数体 sum函数名 &#xff08;&#xff09; 参数表 #include <stdio.h>void sum(int begin, int end) {int i;int sum 0;for (i begin ; i < end ; i) {sum i;}printf("%d到%d的和是%d\n", begin, end, sum); …

比较器使用

1 比较器是什么 2 使用比较器的注意事项 输出是否要接上拉电阻 2.1 推挽结构&#xff08;可以不用加上拉电阻&#xff09; 2.2 开漏结构&#xff08;OD,OC&#xff09;需要加上拉电阻 2.3 LM393 2.4 推挽和开漏 3 比较器的注意事项 输出是否要接上拉电阻 3.1 比较器内部有吸…

爬虫基础(三)Session和Cookie讲解

目录 一、前备知识点 &#xff08;1&#xff09;静态网页 &#xff08;2&#xff09;动态网页 &#xff08;3&#xff09;无状态HTTP 二、Session和Cookie 三、Session 四、Cookie &#xff08;1&#xff09;维持过程 &#xff08;2&#xff09;结构 正式开始说 Sessi…

项目升级Sass版本或升级Element Plus版本遇到的问题

项目升级Sass版本或升级Element Plus版本遇到的问题 如果项目有需求需要用到高版本的Element Plus组件&#xff0c;则需要升级相对应的sass版本&#xff0c;Element 文档中有提示&#xff0c;2.8.5及以后得版本&#xff0c;sass最低支持的版本为1.79.0&#xff0c;所升级sass、…

数据结构-Stack和栈

1.栈 1.1什么是栈 栈是一种特殊的线性表&#xff0c;只允许在固定的一段进行插入和删除操作&#xff0c;进行插入和删除操作的一段称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵顼后进先出LIFO&#xff08;Last In First Out&#xff09;的原则&#xff0c;就像一…

stm32硬件实现与w25qxx通信

使用的型号为stm32f103c8t6与w25q64。 STM32CubeMX配置与引脚衔接 根据stm32f103c8t6引脚手册&#xff0c;采用B12-B15四个引脚与W25Q64连接&#xff0c;实现SPI通信。 W25Q64SCK&#xff08;CLK&#xff09;PB13MOSI&#xff08;DI&#xff09;PB15MISO(DO)PB14CS&#xff08…

04树 + 堆 + 优先队列 + 图(D1_树(D8_B*树(B*)))

目录 一、基本介绍 二、相同思想和策略 三、不同的方式的磁盘空间利用 四、知识小结 一、基本介绍 B*树是Btree的变体&#xff0c;在B树的基础上(所有的叶子结点中包含了全部关键字的信息&#xff0c;及指向含有 这些关键字记录的指针)&#xff0c; B*树中非根和非叶子结…

Hot100之哈希

1两数之和 题目 思路解析 解法1--两次循环 解法2--哈希表一次循环 代码 解法1--两次循环 class Solution {public int[] twoSum(int[] nums, int target) {int nums1[] new int[2];int length nums.length;for (int i 0; i < length; i) {for (int j i 1; j < …

Autosar-以太网是怎么运行的?(原理部分)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 1.TCP/IP协议详解 TCP/IP协议包含了一系列的协议&#xff0c;也叫TCP/IP协议族&#xff08;TCP/IP P…

2025年大数据毕业设计选题推荐:数据分析与可视化 数据挖掘

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

如何在vs2022中处理python下无法输出中文问题

1.如何在vs2022中处理python下无法输出中文问题 进入vs界面时---工具菜单---自定义----在自定义窗口下选中”命令”页面----在菜单栏内----选择文件----再点击添加命令----左侧栏下滑找到文件-----在右侧往下拉找到并点击高级保存选项----再点击确定。 此时VS工程页面上会出现…

SSRF 漏洞利用 Redis 实战全解析:原理、攻击与防范

目录 前言 SSRF 漏洞深度剖析 Redis&#xff1a;强大的内存数据库 Redis 产生漏洞的原因 SSRF 漏洞利用 Redis 实战步骤 准备环境 下载安装 Redis 配置漏洞环境 启动 Redis 攻击机远程连接 Redis 利用 Redis 写 Webshell 防范措施 前言 在网络安全领域&#xff0…

UniApp开发的微信小程序主包过大问题及解决方案 编译小程序时Node-modules被打入主包

欢迎关注 『开发必备』 专栏,专注于解决你在开发过程中遇到的各种问题,帮你快速找到解决方案,节省大量调试时间。内容持续更新中,保证每篇都值得收藏! UniApp开发的微信小程序主包过大问题及解决方案 在使用UniApp开发微信小程序时,很多开发者都会遇到一个问题:打包后,…

Diffusion--人工智能领域的革命性技术

在人工智能领域&#xff0c;“diffusion”一词通常指的是“扩散模型”&#xff08;Diffusion Models&#xff09;&#xff0c;其全称为“Denoising Diffusion Probabilistic Models”&#xff08;DDPMs&#xff09;。扩散模型是一类生成式模型&#xff0c;它通过逐步去噪的方式…

升级到Mac15.1后pod install报错

升级Mac后&#xff0c;Flutter项目里的ios项目运行 pod install报错&#xff0c; 遇到这种问题&#xff0c;不要着急去百度&#xff0c;大概看一下报错信息&#xff0c;每个人遇到的问题都不一样。 别人的解决方法并不一定适合你&#xff1b; 下面是报错信息&#xff1a; #…

基于 oneM2M 标准的空气质量监测系统的互操作性

论文标题 英文标题&#xff1a; Interoperability of Air Quality Monitoring Systems through the oneM2M Standard 中文标题&#xff1a; 基于 oneM2M 标准的空气质量监测系统的互操作性 作者信息 Jonnar Danielle Diosana, Gabriel Angelo Limlingan, Danielle Bryan Sor…

利用Muduo库实现简单且健壮的Echo服务器

一、muduo网络库主要提供了两个类&#xff1a; TcpServer&#xff1a;用于编写服务器程序 TcpClient&#xff1a;用于编写客户端程序 二、三个重要的链接库&#xff1a; libmuduo_net、libmuduo_base、libpthread 三、muduo库底层就是epoll线程池&#xff0c;其好处是…