“继承与组合:代码复用的两种策略“

news2024/11/25 6:45:09
White graces:个人主页

🐹今日诗词:"故人陆续凋零,好似风中落叶啊"🐹

🙉 内容推荐:“掌握类与对象,点亮编程之路“(下)🙉

🙉专栏推荐:“Java入门指南:从零开始学习Java编程”🙉


快去学习

 

目录

🌸思维导图🌸

🌸一.继承🌸

🍎1.什么是继承?🍎

🍎2.继承的语法🍎

🍎 3.子类访问父类优先级🍎

🌳1.super关键字🌳

🍎4.子类如何初始化🍎

🍎5.protected关键字🍎

🍎6.继承关系🍎

🍎7. final关键字🍎

🌸二.组合🌸

🌸三.结语+美图分享🌸


🌸思维导图🌸

 

🌸一.继承🌸

🍎1.什么是继承?🍎

生活中的继承一般和财产遗产挂钩,这些东西还有重复使用的价值,一般这个过程就是继承

Java中的继承也类似:将许多成员共有的特性写在一起,需要使用继承(调用)即可,不需要重复书写代码。

🍎2.继承的语法🍎

📚继承需要用到关键字:extends

📚继承是针对类的

📚继承语法:B extends A,这个例子表示B类继承A类

📗我们来看下面的图片⬇️⬇️

📚此时就会出现两个概念:父类,子类

📚我们把A称为父类B称为子类

🍎 3.子类访问父类优先级🍎

📚规则:子类父类变量同名,采用就近原则

               不同名正常访问即可

📗我们来看下面的图片⬇️⬇️

 运行结果

📚这时候大家肯定会想,如果我就想访问父类的成员,该怎么办呢?

📚因此Java提供了super关键字,用于在子类中访问父类的成员

🌳1.super关键字🌳

📚作用一:用于在子类中访问父类的成员

🍎4.子类如何初始化🍎

📚一般情况的初始化我们已经学会了,可以参考:调用构造方法初始化

📚子类的初始化有所不同,父子父子,先有父再有子

📚想要初始化子类要先帮助父类进行初始化

📚super关键字作用二:在子类中,调用父类的构造方法,帮助父类初始化

📚有了构造方法 != 初始化了,

📚初始化可以大致理解成赋值,而构造方法只是一个方法,并没有赋值。

📗下面我们来看看如何子类初始化⬇️⬇️

package Test1;
class Animal {
    String name;
    int age;
    public Animal(String name, int age) { //父类的构造方法
        this.name = name;
        this.age = age;
        System.out.println("父类初始化"); //这是个标记,用于直观看到父类初始化
    }
}
class Dog extends Animal {
    public Dog(String name, int age) { //将Ikun和25传进来
        super(name, age); //通过super关键字再把姓名、年龄给父类(赋值),帮助父类初始化
        System.out.println("子类初始化"); //这是个标记,用于直观看到子类初始化
    }

    public void bark() { //子类自己特有的构造方法
        System.out.println("正在汪汪叫");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Dog dog =new Dog("Ikun",25);
        //这里我们只实例化对象,并没有调用类里面的方法
    }
}

📚当我们执行程序的时候,编译器会自动执行构造方法进行初始化,而不是我们去调用执行

📚执行特点:先执行父类,再执行子类

📚还有两种初始化方法:静态代码块初始化、实例代码块初始化(不常用)

📚于是又会出现一个问题,三个同时出现,先执行哪一个呢?

package Test1;
class Animal {
    String name;
    int age;
    public Animal(String name, int age) { //父类构造方法
        this.name = name;
        this.age = age;
        System.out.println("父类构造代码块");
    }
    static { //父类静态代码块
        System.out.println("父类静态代码块");
    }
    {  //父类实例代码块
        System.out.println("父类实例代码块");
    }
}
class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
        System.out.println("子类构造代码块");
    }
    static { //子类静态代码块
        System.out.println("子类静态代码块");
    }
    {  //子类实例代码块
        System.out.println("子类实例代码块");
    }
    public void bark() {
        System.out.println("正在汪汪叫");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Dog dog =new Dog("Ikun",25);
        System.out.println("==================");
        Dog dog1 = new Dog("大黄",5);
        //这里我们只实例化对象,并没有调用类里面的方法
    }
}

运行结果

结论

1.静态代码块最早执行,且只执行一次

2.然后执行父类实例代码块(先)和父类构造代码块(后)

3.再执行子类实例代码块(先)和子类构造代码块(后)

🍎5.protected关键字🍎

📚继上篇知识,我们知道protected是访问修饰限定符

📗访问范围:1.同一包的同一类

📗                  2.同一包的不同类

📗                  3.不同包的子类

 🍎6.继承关系🍎

📚继承一般分为三种:单继承、多层继承、多继承

📚我们直接画图演示,看完你就明白了。

 

📚Java支持:单继承、多层继承

📚        不支持:多继承(😳一个孩子不可能有两亲生父亲😳)

🍎7. final关键字🍎

📚修饰范围:方法、成员变量、类。

作用

修饰类:此类不能被继承

修饰变量:则它的值不能被更改,变成常量了

修饰方法:此方法不能被重写(不是重载),后面会说

🌸二.组合🌸

📚由于Java不支持多继承,当我有时候又会碰到这样的情况,这时候组合就有妙用了

📚比如一辆汽车,由轮胎、发动坤、车载系统.......构成

📚组合把类创建的对象当作成员变量

package Test1;
class Tire{ //轮胎

}

class Engine{ // 发动机类

}

class VehicleSystem{ // 车载系统类

}
class Car{
    public Tire tire; // 可以复用轮胎中的属性和方法
    public Engine engine; // 可以复用发动机中的属性和方法
    public VehicleSystem vs; // 可以复用车载系统中的属性和方法
    
}
class Benz extends Car{
// 将汽车中包含的:轮胎、发送机、车载系统全部继承下来
    
}
public class Test1 {
    public static void main(String[] args) {
        Benz benz = new Benz();
    }
}

📚这样就通过组合模拟出类似多继承的效果了,这种效果不是很好,后面会使用接口真正实现多继承

🧡🧡🧡🧡🧡🧡🧡🧡🧡

🧡🧡🧡以上就是这篇文章的所有内容了🧡🧡🧡

🧡🧡🧡谢谢阅读本文,希望你能从中获得一些启发和思考 🧡🧡🧡

🌸三.结语+美图分享🌸

 

✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️ 点赞☀️收藏 ⭐️ 关注!😏👍

👍😏⛳️ 点赞☀️收藏 ⭐️ 关注!😏👍

👍😏⛳️ 点赞☀️收藏 ⭐️ 关注!😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

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

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

相关文章

案例17 基于Spring Boot+MyBatis的学生信息维护案例

一、案例需求 基于Spring BootMyBatis实现学生信息的新增、修改、删除、查询功能,并实现MySQL数据库的操作。 MySQL数据库创建学生表(t_student),有主键、姓名、年龄、性别、出生日期、身份证号、电话号码信息。 二、数据初始化…

07 - 查看、创建、切换和删除分支

查看所有文章链接:(更新中)GIT常用场景- 目录 文章目录 1. 查看分支2. 创建和切换分支3. 删除分支 1. 查看分支 git branch -va2. 创建和切换分支 第一种: 创建分支: git branch new_branch切换分支: …

PHP实现在线年龄计算器

1. 输入日期查询年龄 2. php laravel框架实现 代码 /*** 在线年龄计算器*/public function ageDateCal(){// 输入的生日时间$birthday $this->request(birthday);// 当前时间$currentDate date(Y-m-d);// 计算周岁$age date_diff(date_create($birthday), date_create($…

Linux 多进程

目录 0x01 linux中特殊的进程 0x02 进程的标识 0x03 创建子进程 0x01 linux中特殊的进程 0号进程:idle进程,系统启动加载的进程1号进程:systemd进程,系统初始化,是所有进程的祖先进程 init2号进程:kthre…

Zabbix监控Kubernets获取节点模板报错

Preprocessing failed for: {“error”:"Request failed with status code 401: {“kind”:“Status”,“apiVersion”:“v1”,"met ad …1. Failed: Discovery error: TypeError: cannot read property 1 of null. Zabbix 监控 Kubernetes 出现采集错误,…

麒麟系统相关

创建虚拟机 镜像下载地址 选择合适的镜像,进入引导后注意不要选择默认的第一条,选择第二条进入安装程序。 root密码修改 使用命令 sudo passwd root 开启ssh 配置好网络后发现能ping通,但无法ssh连接,ps -ef | grep ssh 得…

基于docker实现主从复制

1:实现主从复制这个过程我是趟过坑的,后面是自己动手搞了几遍都成功了以后才开始决定记录的,(所以有的截图和上下文对不上的,比如说docker容器的名字对应不上,大家就用自己的就好),打…

“数据”对于仓库管理有多重要?!

仓库数据的重要性 做好仓库数据管理对企业的重要性不言而喻。通过有效地管理数据,企业可以更好地了解市场需求和库存情况,快速响应市场变化,提高库存周转率和客户满意度;此外,数据管理还可以帮助企业降低库存成本、减…

提升物流管理效率,快递批量查询高手软件助你一臂之力

物流管理中,准确跟踪和掌握快递的物流信息是非常重要的。而快递批量查询高手软件的出现,大大提高了物流管理的效率,为企业带来了诸多便利。 传统的快递查询方式往往需要手动逐个输入快递单号,费时费力且容易出错。而有了快递批量查…

源于传承,擎领未来,新架构、新工艺下的“换心工程”——金融电子化访中电金信副总经理、研究院院长况文川

当前,商业银行的经营环境正在发生着深刻而复杂的变化,在深化改革主旋律的指引下,数字化转型已成为我国商业银行普遍认同、广泛采用的战略性举措。核心系统作为承载银行业务的关键支柱系统,一直是各银行在金融科技建设中重点关注和…

Linux/centos上如何配置管理NFS服务器?

Linux/centos上如何配置管理NFS服务器? 1 NFS基础了解1.1 NFS概述1.2 NFS工作流程 2 安装和启动NFS服务2.1 安装NFS服务器2.2 启动NFS服务 3 配置NFS服务器和客户端3.1 配置NFS服务器3.2 配置NFS客户端 4 实际示例4.1 基本要求4.2 案例实现 1 NFS基础了解 NFS&…

Android UI自动化测试框架—SoloPi简介

1、UI自动化测试简介 软件测试简介 ​软件测试是伴随着软件开发一同诞生的,随着软件规模大型化,结构复杂化,软件测试也从最初的简单“调试”,发展到当今的自动化测试。 ​ 自动化测试是什么呢?自动化测试是把以人为…

解析固态光耦的独特特点和优势

固态光耦概述及其重要性 固态光耦是一种电子元件,具有独特的光电隔离功能,广泛应用于电气控制、通信和电力系统等领域。本文将深入探讨固态光耦的特点和优势,介绍它在市场中的重要性以及如何提高收录和首页排名。 高速、高精度的信号传输 …

Dolphinscheduler简单应用(二)—— 告警通知

一、本章目标 演示Dolphinscheduler的告警通知功能,将SQL任务组件查询返回结果集指定为邮件通知内容(支持为:表格、附件或表格附件三种模板)。二、 前提条件 已完成Dolphinscheduler部署 K8S集群部署,可参考文章:基于K8S环境部署Dolphinscheduler及简单应用其他部署形式,…

LeetCode236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 文章目录 [236. 二叉树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/)一、题目二、题解方法一:递归构建祖先数组方法二:一个非常方便的递归 一、题目 给定一个二叉树, 找到该树中…

性能测试|App性能测试需要关注的指标

一、Android客户端性能测试常见指标: 1、内存 2、CPU 3、流量 4、电量 5、启动速度 6、滑动速度、界面切换速度 7、与服务器交互的网络速度 二、预期标准指定原则 1、分析竞争对手的产品,所有指标要强于竞品 2、产品经理给出的预期性能指标数据…

青翼科技自研2路250MSPS DA回放FMC子卡模块

FMC150_V30是一款基于VITA57.1规范的2路125MSPS采样率16位分辨率AD采集、2路250MSPS采样率16位分辨率DA回放FMC子卡模块。该模块遵循VITA57.1规范,可直接与符合VITA57.1规范的FPGA载卡配合使用,板卡ADC器件采用ADI公司的AD9268芯片,板卡DAC器…

DDIM: DENOISING DIFFUSION IMPLICIT MODELS

DDIM: DENOISING DIFFUSION IMPLICIT MODELS 去噪扩散隐式模型DDIM预测噪声生成过程 实验 论文题目:Denoising Diffusion Implicit Models (DDIM) 论文来源:ICLR 2021 论文地址:https://arxiv.org/pdf/2010.02502.pdf 论文代码:ht…

“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会顺利召开

研讨会主题 8月10日,“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会在浙江大学计算机创新技术研究院举办。 本次研讨会的主题聚焦于“智能网联汽车的数据安全与数据合规”,邀请行业主管部门和数据…

iptables与firewall的命令的使用

iptables与firewall的命令的使用 安装firewall指令基本使用iptables简介命令查看 IPTABLES 版本查看当前 IPTABLES 规则添加规则修改规则删除某条规则加入白名单备份与还原定义策略 其他 安装 查看是否已安装: CentOS:rpm -qa | grep iptables 安装&am…