设计模式-原型模式

news2024/11/16 19:37:10

设计模式-原型模式

  • 一 官方定义
  • 二 案例演示
    • 解决方案一 - 一般实现方式
      • 实现过程
      • 案例分析
    • 解决方案二
      • 使用场景
      • 实现过程一
      • 实现过程 二
      • 案例分析
  • 三 浅拷贝和深拷贝
    • 浅拷贝问题演示
      • 实现过程
      • 案例分析
    • 解决方案-----深拷贝实现方式一:重写clone()方法
      • 扩展思考

一 官方定义

原型模式的简单程度仅低于单例模式和迭代器模式。使用场景非常多

原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 即实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代价比较大时,则采用这种模式

二 案例演示

需求:打印很多份简历 简历信息都是一样的

解决方案一 - 一般实现方式

实现过程

Resume 简历类

/**
 * @Description 简历类
 */
@Data
@AllArgsConstructor
public class Resume {

    private String name;

    private String job;  //期望职位

    private String salary; //期望薪资

}

测试类

/**
 * @Description 客户端  打印很多份简历  简历信息是一样的
 */
public class Client {

    public static void main(String[] args) {

        Resume resume = new Resume("李逵", "Java开发", "面议");

        for (int i = 0; i < 10; i++) {

            Resume clone = new Resume(resume.getName(), resume.getJob(), resume.getSalary());

            System.out.println(clone + "已打印成功");

        }
    }
}

结果
在这里插入图片描述

案例分析

优势 简单 容易理解
劣势 效率非常低

解决方案二

使用原型模式来实现。核心原理是 实现Cloneable接口重写clone方法。

使用场景

当需要一个类的大量对象的时候
如果一个对象初始化太过繁琐

实现过程一

Resume 简历类
①实现Cloneable接口
②重写clone方法

@Data
@AllArgsConstructor
public class Resume implements Cloneable{

    private String name;

    private String job;  //期望职位

    private String salary; //期望薪资

    @Override
    protected Resume clone(){
        Resume clone = null;
        try {
            clone = (Resume) super.clone();
        } catch (CloneNotSupportedException e) {
            e.getMessage();
        }
        return clone;
    }
}

测试类1

public class Client {

    public static void main(String[] args) {
        Resume resume = new Resume("李逵", "Java开发", "面议");
        for (int i = 0; i < 10; i++) {
            Resume clone =  resume.clone();
            System.out.println(clone);
            System.out.println("clone = " + clone.hashCode());
        }
    }
}

结果
在这里插入图片描述

测试类2

public class Client {

    public static void main(String[] args) {
        Resume resume = new Resume("李逵", "Java开发", "面议");
        System.out.println("resume = " + resume.hashCode());
        for (int i = 0; i < 10; i++) {
            Resume clone =  (Resume)resume.clone();
            clone.setJob("教师2"+i);
            System.out.println(clone);
            System.out.println("clone = " + clone.hashCode());
        }
    }
}

结果
在这里插入图片描述

在这里插入图片描述

使用lombok注解标记实体类,克隆对象发现如果对象值没有任何修改,hashCode值一样,做的是浅拷贝。克隆对象如果对象值有修改,做的是深拷贝。最终排查是由于@Data注解它是一个混合注释,它包含了@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode的功能。@EqualsAndHashCode中属性callSuper 默认为false。所以同类型比较时,当字段相同时,hashcode值是一样的。
解决办法:使用@Getter@Sette r单个注解
@Data取代Get,Set方法的使用总结以及注意事项

实现过程 二

Resume类


public class Resume implements Cloneable{

    private String name;


    private String job;  //期望职位

    private String salary; //期望薪资

    public String getName() {
        return name;
    }
    public Resume(String name, String job, String salary) {
        this.name = name;
        this.job = job;
        this.salary = salary;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public String getSalary() {
        return salary;
    }

    public void setSalary(String salary) {
        this.salary = salary;
    }



    @Override
    public String toString() {
        return "Resume{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", salary='" + salary + '\'' +
                '}';
    }

    @Override
    protected Object clone(){

        Resume resume = null;

        Resume clone = null;
        try {
            clone = (Resume) super.clone();
        } catch (CloneNotSupportedException e) {
            e.getMessage();
        }

        return clone;

    }
}

测试类

public class Client {

    public static void main(String[] args) {

        Resume resume = new Resume("李逵", "Java开发", "面议");

        for (int i = 0; i < 10; i++) {

            Resume clone = (Resume) resume.clone();

            System.out.println(clone);
            System.out.println("clone = " + clone.hashCode());

        }
    }
}

在这里插入图片描述

案例分析

在clone()方法上面增加了一个注解@Override,在Cloneable接口中没有任何方法,那么这个重写的方法是从哪里来的呢。想想看java中所有的类老祖宗是谁? 对嘛 ,Object类,每个类默认都继承了这个类。所以重写是非常正确的----重写了Object类中的clone方法。

三 浅拷贝和深拷贝

浅拷贝

对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递
对于数据类型是引用数据类型的成员变量,那么浅拷贝会进行引用传递

深拷贝

复制对象的所有基本数据类型的成员变量值
为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象

进行深拷贝会复制整个对象,包含对象的引用类型

浅拷贝问题演示

Object类提供的方法clone只是拷贝对象,器对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就是浅拷贝。确实非常浅,两个对象都不拷贝,还是指向原生对象的内部元素大家都能改,是一种非常不安全的方式。

实现过程

Witness类


//证明人类
public class Witness {

    private String name;

    private String job; //职务

    public Witness(String name, String job) {
        this.name = name;
        this.job = job;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    @Override
    public String toString() {
        return "Witness{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                '}';
    }
}

Resume类


//简历类2.0
@Getter
@Setter
@ToString
public class Resume implements Cloneable{

    private String name;

    private String job;

    private String salary;

    private Witness witness; //证明人

    public Resume(String name, String position, String salary) {
        this.name = name;
        this.job = position;
        this.salary = salary;
    }
    @Override
    protected Object clone() {

        Resume resume = null;

        try{
            resume = (Resume) super.clone();

        }catch (CloneNotSupportedException e){

            e.printStackTrace();
        }
        return resume;
    }
}

测试类

public class Client {

    public static void main(String[] args) {

        Resume resume = new Resume("小李", "java开发", "面议");
        Witness witness = new Witness("三叔", "养猪场CTO");
        resume.setWitness(witness);

        Resume clone = (Resume) resume.clone();
        Resume clone1 = (Resume) resume.clone();
        resume.setName("小红" );
        witness.setName("李白");
        Resume clone2 = (Resume) resume.clone();


        System.out.println("clone = " + clone);
        System.out.println("clone1 = " + clone1);
        System.out.println("clone2 = " + clone2);


        System.out.println( "clone=" + clone.hashCode()+ "  witness=" +clone.getWitness().hashCode());

        System.out.println("clone1=" + clone1.hashCode()+ "  witness1=" +clone1.getWitness().hashCode());

        System.out.println("clone2=" + clone2.hashCode()+ "  witness2=" +clone2.getWitness().hashCode());
    }
}

结果
在这里插入图片描述

案例分析

复制的对象中有引用类型时 例如数组,集合,对象。并不会将这些类型复制一份,只是引传递。对其修改时会在原来的基础上进行修改。

解决方案-----深拷贝实现方式一:重写clone()方法

在引用类型的对象中也进行实现Cloneable 重写clone方法。



//证明人类
@Getter
@Setter
@AllArgsConstructor
@ToString
public class Witness implements Cloneable{
    private String name;

    private String job; //职务
    @Override
    protected Witness clone() {

        Witness witness = null;

        try{
            witness = (Witness) super.clone();

        }catch (CloneNotSupportedException e){

            e.printStackTrace();
        }
        return witness;
    }
}

在使用类中处理引用类型


//简历类2.0
@Getter
@Setter
@ToString
public class Resume implements Cloneable {

    private String name;

    private String job;

    private String salary;

    private Witness witness; //证明人 引用类型  ???

    public Resume(String name, String position, String salary) {
        this.name = name;
        this.job = position;
        this.salary = salary;
    }
    //完成深拷贝
    //实现方式一:重写clone方法
    @Override
    protected Object clone() {
        //要拷贝的对象
        Resume resume = null;
        try {
            //分布进行
            //完成对于基本数据类型或者String类型的拷贝
            resume = (Resume) super.clone();
            //对引用类型进行处理
            resume.setWitness(witness.clone());

        } catch (CloneNotSupportedException e) {

            e.printStackTrace();
        }
        return resume;
    }
}


在这里插入图片描述

测试类
在这里插入图片描述

扩展思考

如果是级联引用对象呢? 比如在Witness类中定义引用类型对象DeepCloneableTarget

@Getter
@Setter
@ToString
public class DeepCloneableTarget implements Cloneable {

    private String cloneName;

    private String cloneClass;

    //引用类型呢?

    public DeepCloneableTarget(String cloneName, String cloneClass) {

        this.cloneName = cloneName;

        this.cloneClass = cloneClass;
    }

    //使用默认的就可以

    @Override
    protected DeepCloneableTarget clone() throws CloneNotSupportedException {
        return (DeepCloneableTarget) super.clone();
    }
}

Witness类

//证明人类
@Getter
@Setter
@AllArgsConstructor
@ToString
public class Witness implements Cloneable{
    private String name;

    private String job; //职务

    private DeepCloneableTarget deepCloneableTarget;
    @Override
    protected Witness clone() {

        Witness witness = null;

        try{
            witness = (Witness) super.clone();

        }catch (CloneNotSupportedException e){

            e.printStackTrace();
        }
        return witness;
    }
}

Resume类

@Getter
@Setter
@ToString
public class Resume implements Cloneable {

    private String name;

    private String job;

    private String salary;

    private Witness witness; //证明人 引用类型  ???

    public Resume(String name, String position, String salary) {
        this.name = name;
        this.job = position;
        this.salary = salary;
    }
    //完成深拷贝
    //实现方式一:重写clone方法
    @Override
    protected Object clone() {
        //要拷贝的对象
        Resume resume = null;
        try {
            //分布进行
            //完成对于基本数据类型或者String类型的拷贝
            resume = (Resume) super.clone();
            //对引用类型进行处理
            resume.setWitness(witness.clone());

            resume.getWitness().setDeepCloneableTarget(witness.getDeepCloneableTarget().clone());

        } catch (CloneNotSupportedException e) {

            e.printStackTrace();
        }
        return resume;
    }
}

测试类

public class Client {

    public static void main(String[] args) throws CloneNotSupportedException {

        Resume resume = new Resume("小李", "java开发", "面议");
        DeepCloneableTarget deepCloneableTarget = new DeepCloneableTarget("克隆", "花花");
        Witness witness = new Witness("三叔", "养猪场CTO",deepCloneableTarget);
        resume.setWitness(witness);
        Resume clone = (Resume) resume.clone();
        Resume clone1 = (Resume) resume.clone();
        resume.setName("小红" );
        witness.setName("李白");
        deepCloneableTarget.setCloneClass("草草");
        Resume clone2 = (Resume) resume.clone();

        System.out.println("clone = " + clone);
        System.out.println("clone1 = " + clone1);
        System.out.println("clone2 = " + clone2);

        System.out.println( "clone=" + clone.hashCode()+ "  witness=" +clone.getWitness().hashCode()+" DeepCloneableTarget"+clone.getWitness().getDeepCloneableTarget().hashCode());

        System.out.println("clone1=" + clone1.hashCode()+ "  witness1=" +clone1.getWitness().hashCode()+" DeepCloneableTarget1"+clone1.getWitness().getDeepCloneableTarget().hashCode());

        System.out.println("clone2=" + clone2.hashCode()+ "  witness2=" +clone2.getWitness().hashCode()+" DeepCloneableTarget2"+clone2.getWitness().getDeepCloneableTarget().hashCode());
        

    }
}

结果
在这里插入图片描述

解决方案—深拷贝实现方式二:序列化方式
通过扩展思考案例我们可以发现如果存在级联嵌套引用那么,需要手动写clone方法,非常不方便。那么有没有一种简便的方式来实现深拷贝呢?答案是肯定的。本节就详细介绍序列化方式实现深拷贝。
步骤:
①:级联对象实现序列化接口
②:在拷贝的对象中添加流式克隆

拷贝对象类
Resume

//简历类2.0
@Getter
@Setter
@ToString
public class Resume implements Serializable, Cloneable {

    private static final long serialVersionUID = 1L;
    private String name;

    private String job;

    private String salary;

    private Witness witness; //证明人 引用类型  ???

    public Resume(String name, String position, String salary) {
        this.name = name;
        this.job = position;
        this.salary = salary;
    }
    //完成深拷贝
    //实现方式二:通过对象序列化的方式
    public Object deepClone(){

        //类需要实现序列化接口
        //创建流对象
        ByteArrayOutputStream bos  = null;
        ObjectOutputStream oos  = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;

        //序列化操作
        try {
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            //序列化
            oos.writeObject(this);

            //反序列化操作
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            Resume resume = (Resume) ois.readObject();
            return resume;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            //关闭流对象
            try {
                bos.close();
                oos.close();
                bis.close();
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return null;

    }

}

级联类一 实现序列化接口,克隆接口
Witness

//证明人类
@Getter
@Setter
@AllArgsConstructor
@ToString
public class Witness implements Serializable, Cloneable{
    private String name;

    private String job; //职务

    private DeepCloneableTarget deepCloneableTarget;
    @Override
    protected Witness clone() {

        Witness witness = null;

        try{
            witness = (Witness) super.clone();

        }catch (CloneNotSupportedException e){

            e.printStackTrace();
        }
        return witness;
    }
}

级联类二 实现序列化接口,克隆接口

@Getter
@Setter
public class DeepCloneableTarget implements Serializable, Cloneable {
	
	private String cloneName;

	private String cloneClass;

	public DeepCloneableTarget(String cloneName, String cloneClass) {
		this.cloneName = cloneName;
		this.cloneClass = cloneClass;
	}


	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

	@Override
	public String toString() {
		return "DeepCloneableTarget{" +
				"cloneName='" + cloneName + '\'' +
				", cloneClass='" + cloneClass + '\'' +
				'}';
	}
}

测试类

public class Client {

    public static void main(String[] args) {
        Resume resume = new Resume("小李", "java开发", "面议");
        DeepCloneableTarget deepCloneableTarget = new DeepCloneableTarget("克隆", "花花");
        Witness witness = new Witness("三叔", "养猪场CTO",deepCloneableTarget);
        resume.setWitness(witness);
        Resume clone = (Resume) resume.deepClone();
        Resume clone1 = (Resume) resume.deepClone();
        resume.setName("小红" );
        witness.setName("李白");
        deepCloneableTarget.setCloneClass("草草");
      Resume clone2 = (Resume) resume.deepClone();

        System.out.println("clone = " + clone);
        System.out.println("clone1 = " + clone1);
        System.out.println("clone2 = " + clone2);

        System.out.println( "clone=" + clone.hashCode()+ "  witness=" +clone.getWitness().hashCode()+" DeepCloneableTarget"+clone.getWitness().getDeepCloneableTarget().hashCode());

        System.out.println("clone1=" + clone1.hashCode()+ "  witness1=" +clone1.getWitness().hashCode()+" DeepCloneableTarget1"+clone1.getWitness().getDeepCloneableTarget().hashCode());

        System.out.println("clone2=" + clone2.hashCode()+ "  witness2=" +clone2.getWitness().hashCode()+" DeepCloneableTarget2"+clone2.getWitness().getDeepCloneableTarget().hashCode());

    }
}

结果
通过结果发现能够正确深拷贝对象
在这里插入图片描述

谈谈Java序列化与深拷贝

设计模式 (三)原型模式(提供代码,浅显易懂)

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

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

相关文章

在VMware 虚拟机(Win7)中还原真机Ghost备份的Win10系统

要求&#xff1a; 将真机Ghost备份的Win10系统还原到VMware安装的虚拟机&#xff08;Win7&#xff09;上 真机&#xff08;物理机&#xff09;&#xff1a;win10pro_pure_20220709.GHO &#xff08;备份的GHO文件&#xff09;&#xff1b;安装模式&#xff1a;Win10UEFIGPT 虚…

HashMap源码学习:红黑树原理详解

前言 JDK1.8后的HashMap引入了红黑树&#xff0c;在学习HashMap源码之前&#xff0c;了解了红黑树原理&#xff0c;及其如何通过代码进行实现后&#xff0c;在整体的看HashMap的源码就会简单很多。 概述 红黑树的特性 根节点必须是黑色节点。节点是红色或黑色。所有叶子都是…

Redis原理

Redis内部使用的是文件事件处理器file event handler,它是单线程的,所以Redis叫做单线程模型。它采用IO多路复用机制同时监听多个socket,将产生事件的socket压入内存队列中,事件分派器根据socket上的事件类型来选择对应的事件处理器进行处理。文件事件处理器包含4个部分:多…

【Java寒假打卡】Java基础-线程池

【Java寒假打卡】Java基础-线程池概述基本使用Executors创建指定上限的线程对象线程池-ThreadPoolExecutorvolatile概述 基本使用 package com.hfut.edu.test12;import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class test1 {publ…

java+springboot笔记2023003

java的版本发布&#xff1a; 编译型语言是指使用专门的编译器&#xff0c;针对特定平台&#xff08;操作系统&#xff09; 将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码&#xff08;包括机器指令和操作数&#xff09;&#xff0c;并包装成该平台所能识别的…

Linux下更新curl版本

一、前景 由于低版本的curl存在一定的漏洞&#xff0c;会对我们的服务器安全造成问题&#xff0c;所以&#xff0c;我们需要将curl由低版本安装到高版本。 二、步骤 1、首先检测服务器安装的curl版本 curl --version 2、查看服务器安装的curl的安装包 rpm -qa curl 3、卸载…

基于springboot+mybatis+mysql+jsp房屋租赁管理系统(含论文)

基于springbootmybatismysqljsp房屋租赁管理系统&#xff08;含论文&#xff09;一、系统介绍二、所用技术三、功能展示三、其它系统四、获取源码一、系统介绍 包括管理员、房东、租客三种角色&#xff0c;外加游客(未登录情况) 出租类型包含整租和合租 权限 游客 < 租客 …

适合编程初学者的开源项目:小游戏2048(鸿蒙ArkTS版)

目标 为编程初学者打造入门学习项目&#xff0c;使用各种主流编程语言来实现。 2048游戏规则 一共16个单元格&#xff0c;初始时由2或者4构成。 1、手指向一个方向滑动&#xff0c;所有格子会向那个方向运动。 2、相同数字的两个格子&#xff0c;相遇时数字会相加。 3、每次…

用 JavaScript 写一个新年倒计时

目录前言&#xff1a;主题&#xff1a;运行结果&#xff1a;对应素材&#xff1a;代码实现思路&#xff1a;运行代码&#xff1a;春节的由来&#xff1a;总结&#xff1a;前言&#xff1a; 在春节即将到来&#xff0c;钟声即将响起&#xff0c;焰火即将燃起的日子里&#xff0c…

Kubernetes_CRD自定义资源

系列文章目录 文章目录系列文章目录前言一、CRD操作命令1.1 定义一种资源并查看1.2 使用刚刚定义的资源二、CRD效果演示2.1 实践&#xff1a;定义一种资源并查看2.2 实践&#xff1a;使用刚刚定义的资源总结前言 CRD就是自定义资源&#xff0c;就是自定义 apiVersionKind 参考…

TreeMap 原理实现及常用方法

TreeMap概述 红黑树回顾 TreeMap构造 put方法 get 方法 remove方法 遍历 总结 一. TreeMap概述 TreeMap存储K-V键值对&#xff0c;通过红黑树&#xff08;R-B tree&#xff09;实现&#xff1b; TreeMap继承了NavigableMap接口&#xff0c;NavigableMap接口继承了Sort…

蓝桥杯STM32G431RBT6学习——LED

蓝桥杯STM32G431RBT6学习——LED 前言 LED为每年必考考点&#xff0c;也是入门的基础&#xff0c;国信长天的开发板LED硬件如下&#xff1a; 经典的锁存器控制&#xff0c;因为LED所用引脚与LCD重叠&#xff0c;因此通过锁存器进行控制其状态。当74HC573的LE引脚&#xff08…

C语言综合练习5:快译通下

1 词典文件介绍 前面建立的词典&#xff0c;只有两个单词&#xff0c;现在我们要建立一个上万个单词的词典&#xff0c;所有单词及其翻译都在一个名为dict.txt的文件&#xff08;词典文件&#xff09;中 每个单词有两行&#xff0c;其中一行是单词原文&#xff0c;下一行是对…

Redis中的事务和乐观锁实现

redis事务相关命令&#xff1a; 开启事务&#xff1a;multi 关闭事务&#xff1a;discard 提交事务&#xff1a;exec 正常执行事务情况&#xff1a; 127.0.0.1:6379> multi OK 127.0.0.1:6379> set name zhangsan QUEUED 127.0.0.1:6379> set age 20 QUEUED 127.0.0.1…

AJAX这一篇就够啦~

AJAX这一篇就够啦~AJAX1、AJAX概述1.1 AJAX简介1.2 XML简介1.3 AJAX的特点2、HTTP相关2.1 HTTP概述2.2 请求报文2.3 响应报文2.4 常见的响应状态码2.5 不同类型的请求及其作用2.6 一般http请求 与 ajax请求3、原生AJAX的使用3.1 准备工作3.2 核心对象3.3 GET请求3.4 POST请求3.…

新岁序开,和Jina AI共同码梦! (奖品攻略大揭秘)

Jina AI 北京、深圳、柏林、湾区的小伙伴给您拜年啦&#xff01; Jina AI 开源社区致力于促进 多模态 AI 技术 的应用落地以及传播&#xff0c;一直以来&#xff0c;我们都为拥有这样一个全球化、多元化和高速发展的社区而感到自豪和感激&#xff01;正值新年之际&#xff0c;我…

从C和C++内存管理来谈谈JVM的垃圾回收算法设计-下

从C和C内存管理来谈谈JVM的垃圾回收算法设计-下引言基本概念对象GC ROOTS垃圾回收常见算法标记清除优缺点引用计数优缺点部分标记清除算法优缺点复制算法优缺点多空间复制算法标记整理(标记压缩)优缺点分代设计HotSpot具体实现跨代引用并发可行性经典垃圾回收器Serial新生代垃圾…

Binding常用辅助属性、多重绑定、优先级绑定

Binding常用辅助属性、多重绑定、优先级绑定 Binding常用辅助属性 StringFormat <Window.Resources><sys:Int32 x:Key"myInt">200</sys:Int32><sys:Single x:Key"mySingle">100.123456</sys:Single> </Window.Resourc…

Linux 中断控制器(五):中断号映射

中断号分为硬件中断号(HW ID)和软件中断号(IRQ number)。 这里有两个中断控制器,处理完毕进入 CPU。外设和中断控制器连接在一起,外设给中断控制器的是硬件中断号,如果中断控制器有级联,那么硬件中断号在不同的中断控制器中可能会重复。但是到了 CPU 以后,我们需要对不…

C语言:分支语句和循环语句

往期文章 C语言&#xff1a;初识C语言 目录往期文章前言1. 什么是语句2. 分支语句&#xff08;选择结构&#xff09;2.1 if语句2.2 switch语句3. 循环语句3.1 while循环3.2 for循环3.3 do while 循环3.4 goto语句后记前言 趁热打铁啊。写完该系列第一篇博客我就来劲了&#x…