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

UML 类图基础和类关系辨析

UML 类图

目录

  • 1 概述

  • 2 类图MerMaid基本表示法

  • 3 类关系详解

    • 3.1 实现和继承
      • 3.1.1 实现(Realization)
      • 3.1.2 继承/泛化(Inheritance/Generalization)
    • 3.2 聚合和组合
      • 3.2.1 组合(Composition)
      • 3.2.2 聚合(Aggregation)
    • 3.3 关联和依赖
      • 3.3.1 关联(Association)
        • 重数性(Multiplicity)
        • 导航性 (navigability)
        • 3.3.1.1 关联关系的分类
          • 3.3.1.1.1 双向关联(无箭头或双箭头)
          • 3.3.1.1.2 单向关联(单箭头)
          • 3.3.1.1.3 限制关联
          • 3.3.1.1.4 自关联和递归关联
      • 依赖关系 (Dependency)
    • 3.4 类关系的深度解析
      • 3.4.1 基础关系矩阵
      • 3.4.2 关系判定三维度
      • 3.4.3 特殊关系辨析
      • 3.4.4 建模实践原则
      • 3.4.5 关系速查口诀
  • 4 注意事项

  • 5 应用建议

  • 参考资料

    类图 | Mermaid 中文网

1 概述

在软件工程中,统一建模语言 (UML) 中的类图Class Diagram是一种静态结构图,它通过显示系统的类、它们的属性、操作 (或方法) 以及对象之间的关系来描述系统的结构。

  1. 定义 :UML(Unified Modeling Language统一建模语言)类图是用来描述系统中类的静态结构和它们之间的关系的一种图。
    1. 类的静态结构
    2. 类的属性与方法
    3. 类之间的关系,例如:依赖、关联、继承等关系。
    4. 系统组成部分的协作关系
  2. 作用
    1. 系统分析和设计:帮助理解系统的结构和功能。
    2. 代码可视化:将代码结构映射到类图上,便于理解和维护。
    3. 团队沟通:作为统一的建模语言,促进团队成员之间的交流和协作。
  3. 类图的基本元素
    1. 类(Class):表示系统中的实体或概念,通常用矩形表示。
    2. 接口(Interface):用圆角矩形表示,包含接口名和方法。
    3. 对象(Object):类的实例,用矩形框带有下划线表示。
    4. 属性(Attribute):类的特性或数据成员,用带有属性名和类型的矩形表示。
    5. 操作(Operation):类的行为或方法,用带有操作名和参数的椭圆表示。
    6. 关系(Relationship):表示类之间的联系,如继承、关联、聚合、组合等。
  4. 我常用的UML工具
    1. MerMaid
    2. 如果类图复杂,使用Draw.io将MerMaid代码导入并调整布局和扩展

2 类图MerMaid基本表示法

请参考Class diagrams | Mermaid

3 类关系详解

3.1 实现和继承

3.1.1 实现(Realization)

  • 定义::表示类与接口之间的关系

  • 特点

    • 类实现接口定义的方法
    • 支持多接口实现
  • UML表示:空心三角形箭头 + 虚线 (<|…) ,箭头指向接口

  • 代码示例

    interface Flyable {void fly();
    }
    class Bird : Flyable {public void fly() { /*...*/ }
    }
    
    Flyable
    Bird

3.1.2 继承/泛化(Inheritance/Generalization)

  • 定义:父子类之间的"is-a"关系

  • 特点

    • 子类继承父类属性和方法
    • 支持多态性
    • 父类更通用,子类更具体
  • UML表示:空心三角箭头 + 实线 (<| --) ,从子类指向父类。

  • 代码示例

    class Animal {}
    class Dog : Animal {}
    
    Animal
    Dog

3.2 聚合和组合

3.2.1 组合(Composition)

  • 定义:强聚合关系,部分不能脱离整体存在

  • 特点

    • 强生命周期绑定
    • 整体负责部分的创建与销毁
  • UML表示:实心菱形(整体端)+ 实线 (*--),整体 *-- 部分

  • 示例

    • 在线学习平台的课程与课程章节:一个在线学习平台的课程通常由多个章节组成。课程作为一个整体,课程章节作为部分,章节的存在和使用完全依赖于所属的课程。例如,当一个编程语言课程创建后,课程中添加的各个章节(如基础语法章节、面向对象编程章节等)才会被学生学习,只有在课程被访问时,其章节才会被展示和学习,如果该课程从平台上下架删除,那么相应章节也会被删除,无法脱离课程单独存在或被其他课程使用。
  • 代码实现

    using System;
    using System.Collections.Generic;// 课程章节类
    public class CourseChapter
    {private string chapterName;private string chapterContent;public CourseChapter(string chapterName, string chapterContent){this.chapterName = chapterName;this.chapterContent = chapterContent;}public void DisplayChapterInfo(){Console.WriteLine($"章节名称:{chapterName},章节内容:{chapterContent}");}
    }// 课程类
    public class OnlineCourse
    {private string courseName;private List<CourseChapter> chapters = new List<CourseChapter>();public OnlineCourse(string courseName){this.courseName = courseName;}public void AddChapter(string chapterName, string chapterContent){CourseChapter chapter = new CourseChapter(chapterName, chapterContent);chapters.Add(chapter);}public void DisplayCourseInfo(){Console.WriteLine($"课程名称:{courseName}");Console.WriteLine("课程包含的章节:");foreach (CourseChapter chapter in chapters){chapter.DisplayChapterInfo();}}
    }// 测试类
    public class Program
    {public static void Main(){OnlineCourse javaCourse = new OnlineCourse("C# 编程教程");javaCourse.AddChapter("基础语法", "介绍了的变量、数据类型、运算符等基础语法知识");javaCourse.AddChapter("面向对象编程", "讲解了 中的类、对象、继承、多态等面向对象编程概念");javaCourse.DisplayCourseInfo();}
    }
    
    contains
    CourseChapter
    - chapterName: string
    - chapterContent: string
    +CourseChapter(string, string)
    +DisplayChapterInfo()
    OnlineCourse
    - courseName: string
    - chapters: List<CourseChapter>
    +OnlineCourse(string)
    +AddChapter(string, string)
    +DisplayCourseInfo()

3.2.2 聚合(Aggregation)

  • 定义:"has-a"关系,整体与部分可独立存在

  • 特点

    • 弱包含关系
    • 生命周期不绑定
  • UML表示:空心菱形(整体端)+ 实线箭头,整体o-- 部分

  • 示例

    • 订单(Order)订单项(OrderItem)是聚合关系,订单 “包含” 订单项,但订单项可以独立于订单存在(例如可以在库存管理中单独处理订单项)。
    • 生命周期不绑定:即使订单被删除,订单项对象本身仍然可以存在,它们只是不再被该订单关联而已。
    • 订单类通过维护一个订单项列表来管理多个订单项,这体现了整体(订单)与部分(订单项)之间的弱包含关系。
  • 代码实现

    using System;
    using System.Collections.Generic;// 订单项类
    public class OrderItem
    {public int ProductId { get; set; }public string ProductName { get; set; }public decimal Price { get; set; }public int Quantity { get; set; }public OrderItem(int productId, string productName, decimal price, int quantity){ProductId = productId;ProductName = productName;Price = price;Quantity = quantity;}
    }// 订单类
    public class Order 
    {public int OrderId { get; set; }public DateTime OrderDate { get; set; }public List<OrderItem> OrderItems { get; set; }public Order(int orderId, DateTime orderDate){OrderId = orderId;OrderDate = orderDate;OrderItems = new List<OrderItem>();}// 添加订单项public void AddOrderItem(OrderItem item){OrderItems.Add(item);}
    }public class Program
    {public static void Main(){// 创建订单Order order = new Order(1001, DateTime.Now);// 创建订单项OrderItem item1 = new OrderItem(201, "Laptop", 800.00m, 1);OrderItem item2 = new OrderItem(202, "Mouse", 20.00m, 2);// 将订单项添加到订单order.AddOrderItem(item1);order.AddOrderItem(item2);// 输出订单信息Console.WriteLine($"Order ID: {order.OrderId}");Console.WriteLine($"Order Date: {order.OrderDate}");Console.WriteLine("Order Items:");foreach (var item in order.OrderItems){Console.WriteLine($"Product ID: {item.ProductId}, Product Name: {item.ProductName}, Price: {item.Price}, Quantity: {item.Quantity}");}}
    }
    
    contains
    Order
    +int OrderId
    +DateTime OrderDate
    +List<OrderItem> OrderItems
    +Order(int orderId, DateTime orderDate)
    +AddOrderItem(OrderItem item) : void
    OrderItem
    +int ProductId
    +string ProductName
    +decimal Price
    +int Quantity
    +OrderItem(int productId, string productName, decimal price, int quantity)

3.3 关联和依赖

3.3.1 关联(Association)

3.3.1.1 关联关系的分类
3.3.1.1.1 双向关联(无箭头或双箭头)

默认是双向的。

示例:在电商公司中,每个客户可以有多个订单,而每个订单都属于一个特定的客户。当客户创建新订单时,系统会自动将客户与订单关联起来。

  • 代码

    public class Customer
    {public Guid Id { get; } = Guid.NewGuid();public string Name { get; set; }public List<Order> Orders { get; } = new List<Order>();  // 导航到订单
    }public class Order
    {public string OrderNumber { get; }public DateTime CreateTime { get; } = DateTime.Now;public Customer Owner { get; }  // 导航到客户public Order(Customer owner){OrderNumber = $"ORD-{DateTime.Now:yyyyMMddHHmmss}";Owner = owner;owner.Orders.Add(this);  // 双向关联建立}
    }// 使用示例
    var customer = new Customer { Name = "科技公司" };
    var order1 = new Order(customer);
    var order2 = new Order(customer);
    Console.WriteLine($"{customer.Name}的订单数:{customer.Orders.Count}");
    
  • MerMiad示例

    "导航到订单"
    1
    N
    Customer
    + Guid Id
    + string Name
    + List Orders
    Customer()
    Order
    + string OrderNumber
    + DateTime CreateTime
    + Customer Owner
    Order(Customer)
3.3.1.1.2 单向关联(单箭头)

类的关联关系也可以是单向的,单向关联用带箭头的实线表示。

在物流配送系统中,每个包裹可以有多个运输标签,用于指示包裹的目的地。

  • 代码

    public class Package
    {public string TrackingNumber { get; } = Guid.NewGuid().ToString("N");public List<TransportLabel> Labels { get; } = new();  // 单向导航到运输标签
    }public class TransportLabel
    {public string Barcode { get; } = Guid.NewGuid().ToString("N").Substring(0, 12);public string Destination { get; set; }
    }// 使用示例
    var package = new Package();
    package.Labels.Add(new TransportLabel { Destination = "上海仓库" });
    package.Labels.Add(new TransportLabel { Destination = "北京分拨中心" });
    Console.WriteLine($"包裹跟踪号:{package.TrackingNumber}");
    
  • MerMaid

    包含多个运输标签
    1
    N
    Package
    +string TrackingNumber
    +List Labels
    TransportLabel
    +string Barcode
    +string Destination
3.3.1.1.3 限制关联

限定关联具有限定符

限定符的作用类似HashMap中的键(key),用于从一个集合中选择一个或多个对象。

例如,在一个企业资源规划(ERP)系统中,每个用户可以在不同的业务场景下具有不同的角色。

public class User {private Map<String, Role> roles;public Role getRole(String scenario){return roles.get(scenario);}
}
public class Role {
}

在这里插入图片描述

3.3.1.1.4 自关联和递归关联
  • 自关联(Self-association):表示一个类与自身相关联。

    例如,一个公司可以拥有多个子公司,而子公司也可以有自己的子公司。

    public class Node {private Node subNode;
    }
    
  • 递归关联(Recursive association):与自关联类似,但更强调关系的传递性。

    例如,一个文件夹可以包含多个子文件夹,子文件夹也可以包含其他子文件夹。

    Children
    Creates
    TreeNode
    +Value: int
    +Children: List
    +TreeNode(value: int)
    +AddChild(child: TreeNode)
    Program
    +Main()
    +PrintTree(node: TreeNode, level: int)

依赖关系 (Dependency)

  • 概念:依赖则表示一个类在某种程度上依赖于另一个类的定义。

  • 特点:

    1. 是一种使用关系,通常是短暂的,例如一个类的方法内部使用到另一个类。
    2. 侧重于描述一个类对另一个类的功能或服务的使用,而不涉及持有对方的实例或对象。
    3. 依赖关系通常是临时性的、相对不稳定的,并且依赖的方向是从依赖者指向被依赖者。
  • UML表示:虚线箭头(… >),可标注角色名和多重

  • 示例:

    using System;namespace DependencyExample
    {// EmailService 类,用于发送邮件public class EmailService{public void SendEmail(string to, string subject, string body){Console.WriteLine($"Sending email to {to}: {subject} - {body}");}}// Customer 类,依赖 EmailService 类来发送邮件public class Customer{public string Email { get; set; }// 在方法内部使用 EmailService 类,表现出依赖关系public void NotifyByEmail(string subject, string message){EmailService emailService = new EmailService();emailService.SendEmail(Email, subject, message);}}class Program{static void Main(string[] args){Customer customer = new Customer();customer.Email = "customer@example.com";// 调用 Customer 类的方法,触发对 EmailService 类的依赖customer.NotifyByEmail("Order Confirmation", "Your order has been confirmed.");}}
    }
    
    • MerMaid类图
      Uses
      Creates and uses
      EmailService
      +SendEmail(to: string, subject: string, body: string)
      Customer
      -Email: string
      +NotifyByEmail(subject: string, message: string)
      Program
      +Main(args: string[])

3.4 类关系的深度解析

3.4.1 基础关系矩阵

关系类型强度生命周期UML表示代码特征典型示例
依赖临时`…>` 虚线方法参数/局部变量`Order …> Payment`
关联★★独立`- ->` 实线成员变量持有引用`Teacher --> Student`
聚合★★★部分独立`- -` 空心菱形外部传入部分对象`Library o– Book`
组合★★★★依赖整体`- -` 实心菱形内部创建部分对象`School *– Classroom`

3.4.2 关系判定三维度

  • 生命周期耦合度

    强依赖
    弱依赖
    无依赖
    组合
    整体销毁则部分消亡
    聚合
    整体销毁不影响部分
    关联
    对象独立存在
  • 对象控制权

    • 强控制:组合(整体创建/销毁部分)
    • 弱控制:聚合(外部管理部分对象)
    • 无控制:关联(平等协作关系)
  • 业务语义表现

    // 组合关系示例
    class Human {Heart heart = new Heart(); // 内部创建不可替换
    }// 聚合关系示例
    class Car {Tire[] tires; // 外部装配可更换
    }// 关联关系示例
    class Professor {List<Student> advisees; // 平等协作
    }
    

3.4.3 特殊关系辨析

  • 聚合 vs 关联的灰度边界

    • 共性特征:均通过成员变量持有引用
    • 核心差异:
      1. [聚合] 隐含整体-部分语义(汽车-轮胎)
      2. [关联] 强调平等协作关系(学生-课程)
      
  • 记忆决策树

    是否整体-部分关系?
    ├─ 是 → 部分能否独立存在?
    │   ├─ 能 → 聚合(空心菱形)
    │   └─ 否 → 组合(实心菱形)
    └─ 否 → 是否持久持有?├─ 是 → 关联(箭头实线)└─ 否 → 依赖(箭头虚线)
    

3.4.4 建模实践原则

  1. 语义优先原则
    • 避免仅通过代码结构判断关系类型
    • 示例:即使同样使用成员变量,Professor-Student是关联,Car-Tire是聚合
  2. 生命周期驱动设计
    • 组合关系应严格满足:整体.create(部分) && 整体.delete(部分)
    • 反例:使用组合表示可更换的汽车发动机将导致设计僵化
  3. 模式适配策略
    • 聚合关系常对应:对象池模式、共享组件模式
    • 组合关系常对应:建造者模式、工厂方法模式

3.4.5 关系速查口诀

👐 依赖弱,参数传,工具用完不再看
🤝 关联弱,成员留,合作长久不停休
🚗 聚合中,外部传,轮胎汽车换自由
❤️ 组合强,内部有,人心同命共腐朽

4 注意事项

  1. 保持简洁和清晰,避免过多的细节,不要过度设计关系
  2. 正确表达关系和多重性。避免循环依赖,
  3. 保持合理抽象层次,控制类关系的层级深度
  4. 及时更新类图以反映系统的变化。
  5. 保持类图与代码实现的一致性

5 应用建议

  1. 优先使用组合/聚合代替继承(设计原则)
  2. 接口实现增强系统扩展性
  3. 合理控制关联关系的复杂度
  4. 依赖关系常用于模块解耦

相关文章:

UML 类图基础和类关系辨析

UML 类图 目录 1 概述 2 类图MerMaid基本表示法 3 类关系详解 3.1 实现和继承 3.1.1 实现&#xff08;Realization&#xff09;3.1.2 继承/泛化&#xff08;Inheritance/Generalization&#xff09; 3.2 聚合和组合 3.2.1 组合&#xff08;Composition&#xff09;3.2.2 聚…...

15.三数之和(LeetCode)java

个人理解&#xff1a; 1.使用双指针做法&#xff0c;首先对数组进行排序 第一重for循环控制第一个数&#xff0c;对数组进行遍历。双指针初始化为lefti1, rigthnums.length-1。然后使用while循环移动双指针寻找合适的数。因为返回的是数&#xff0c;不是下标&#xff0c;数不能…...

Spark读取Apollo配置

--conf spark.driver.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 --conf spark.executor.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 在spark的提交命令中&…...

如何通过 Websoft9 应用自托管平台一键安装任意版本 Odoo?

手工安装 Odoo 的复杂流程 环境准备阶段&#xff1a;安装 Docker 需熟悉 Linux 系统操作&#xff0c;需配置软件源、解决依赖冲突&#xff1b; 镜像获取阶段&#xff1a;从 Docker Hub 拉取官方镜像时可能因网络问题失败&#xff0c;且需自行验证版本兼容性&#xff1b; 容器…...

Anaconda3使用conda进行包管理

一、基础包管理操作 ‌安装包‌ 使用 conda install <包名> 安装指定包&#xff0c;支持多包批量安装和版本指定&#xff1a; conda install numpy # 安装单个包 conda install numpy scipy pandas # 批量安装多个包 conda install numpy1.21 # 指定版本 conda instal…...

exec和spawn

前言 需求&#xff1a;做一个electron应用&#xff0c;用node打开exe软件&#xff0c;打开后返回成功与否&#xff0c;打开的软件不会随electron应用的关闭而关闭 exec exec 第一个参数为要运行的command命令&#xff0c;参数以空格分隔。 child_process.exec(command[, opti…...

整平机:精密制造的“隐形守护者”

在金属加工车间里&#xff0c;一块表面凹凸不平的钢板经过一组高速旋转的辊轮后&#xff0c;神奇地变得如镜面般平整——这看似简单的场景背后&#xff0c;隐藏着现代工业对材料精度近乎苛刻的追求。整平机&#xff0c;这个常被忽视的工业设备&#xff0c;实则是高端制造业的基…...

Lesar: 面向 Lustre/Scade 语言的形式化模型检测工具

在《同步反应式系统》的第一课中&#xff0c;介绍了同步数据流语言 Lustre 生态中的形式化模型检查器 Lesar 的用法。Lesar 可对 lustre v4 语言以及 Scade 语言中部分数据流核心特性进行模型检查。 Lesar 介绍 Lesar 是 Verimag 研发维护的形式化方法模型检查工具。该工具的理…...

C++中的vector和list的区别与适用场景

区别 特性vectorlist底层实现动态数组双向链表内存分配连续内存块非连续内存块随机访问支持&#xff0c;通过索引访问&#xff0c;时间复杂度O(1)不支持&#xff0c;需遍历&#xff0c;时间复杂度O(n)插入/删除末尾操作效率高&#xff0c;时间复杂度O(1)任意位置操作效率高&am…...

VRRP与防火墙双机热备实验

目录 实验一&#xff1a;VRRP负载均衡与故障切换 实验拓扑​编辑一、实验配置步骤 1. 基础网络配置 2. VRRP双组配置 二、关键验证命令 1. 查看VRRP状态 2. 路由表验证 三、流量分析 正常负载均衡场景&#xff1a; 故障切换验证&#xff1a; 实验二&#xff1a;防火…...

win11什么都不动之后一段时间黑屏桌面无法显示,但鼠标仍可移动,得要熄屏之后才能进入的四种解决方法

现象&#xff1a; 1. 当时新建运行的资源管理器的任务卡了或者原本资源管理器卡了 比如&#xff1a;当时在文本框中输入explorer 注&#xff1a;explorer.exe是Windows的文件资源管理器&#xff0c;它用于管理Windows的图形外壳&#xff0c;包括桌面和文件管理 按住CtrlAltEs…...

【前端】【业务场景】【面试】在前端开发中,如何优化 SVG(可缩放矢量图形)的性能,特别是在处理复杂图形和动画时

SVG 性能优化&#xff1a;循序渐进 4 步法 目标&#xff1a;先减负 → 再复用 → 后加速 → 最后按场景微调 ① 精简—把包袱先丢掉 删除无用元素 隐藏/被遮挡的 <path>、未引用的 <defs> 里渐变、滤镜。 合并路径 同填充色或描边的路径 ⇒ SVGO / SVGOMG「Mer…...

基于LAB颜色空间的增强型颜色迁移算法

本文算法使用Grok完成所有内容&#xff0c;包含算法改进和代码编写&#xff0c;可大大提升代码编写速度&#xff0c;算法改进速度&#xff0c;提供相关idea&#xff0c;提升效率&#xff1b; 概述 本文档描述了一种基于LAB颜色空间的颜色迁移算法&#xff0c;用于将缩略图D的…...

基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 单自由度磁悬浮减振器工作原理简介 4.2 SIMMECHANICS工具箱 5.完整工程文件 1.课题概述 基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真。其中&#xff0c;SIMMECHANICS是M…...

河北省大数据应用创新大赛样题

** 河北省大数据应用创新大赛样题 ** 1. 在Linux下安装Java并搭建完全分布式Hadoop集群。在Linux终端执行命令“initnetwork”&#xff0c;或双击桌面上名称为“初始化网络”的图标&#xff0c;初始化实训平台网络。 【数据获取】 使用wget命令获取JDK安装包&#xff1a; “w…...

RabbitMQ 的专业术语

术语定义示例/说明生产者&#xff08;Producer&#xff09;发送消息到 RabbitMQ 的客户端应用程序。日志系统将错误信息发送到 RabbitMQ。消费者&#xff08;Consumer&#xff09;从 RabbitMQ 队列中接收并处理消息的客户端应用程序。一个订单处理服务从队列中读取消息并更新数…...

【教程】安装 iterm2 打造漂亮且高性能的 mac 终端

【教程】安装 iterm2 打造漂亮且高性能的 mac 终端_mac 安装iterm2-CSDN博客 全面解析&#xff1a;Github网站无法访问的解决方法! 安装myzh 参考文章&#xff1a;https://blog.csdn.net/qq_44741467/article/details/135727124 下载地址&#xff1a;GitCode - 全球开发者的开源…...

redis特性及应用场景

文章目录 什么是redis&#xff1f;热库redis作为热库的特性redis适用场景 什么是redis&#xff1f; redis在系统架构中的位置就是冷热分离架构的热数据库位置&#xff0c; redis就是热库&#xff0c; 我们一般说缓存数据库。 其他的像MySQL、SQL Server这种关系数据库、MongoDB…...

算法 | 鲸鱼优化算法(WOA)原理,公式,应用,算法改进研究综述,完整matlab代码

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 鲸鱼优化算法 一、原理与公式二、应用领域三、算法改进研究四、完整MAT…...

前端面试常见部分问题,及高阶部分问题

面试中也极有可能让你徒手写代码,无聊的面试问题o( ̄︶ ̄)o 一、HTML/CSS 基础与进阶 常见问题 什么是语义化标签?有哪些常用语义化标签? 答案:语义化标签是指具有明确含义的 HTML 标签,如 <header>、<footer>、<article>、<section> 等。它们有…...

C++初登门槛

多态 一、概念 多态是指不同对象对同一消息产生不同响应的行为。例如&#xff0c;蓝牙、4G、Wi-Fi 对“发送数据”指令有不同的具体实现。 二、核心理解 本质&#xff1a;通过基类指针或引用操作子类对象&#xff0c;实现运行时动态绑定。 表现形式&#xff1a; 接口统一&a…...

C/C++线程详解

一、C语言线程创建&#xff08;POSIX线程&#xff09; 1. 基本创建方法 POSIX线程&#xff08;pthread&#xff09;是C语言中创建线程的标准API&#xff1a; #include <pthread.h> #include <stdio.h>void* thread_func(void* arg) {printf("Thread runnin…...

红队系列-网络安全知识锦囊-CTF(持续更新)

CTF CTF系列-AWD专题篇CTF-比赛培训基础1 CTF 介绍HTTP协议分析进阶001.CTF简介_宽字节注入高级 2018CTF——黑客大赛特训CTF-PWNPWNCTF竞赛中的主要题型之一了解CTF Capture The Flag 夺旗描述:# gets从标准输入设备读字符串函数#下面是对main函数中的汇编代码的解释:modifi…...

Windows环境下常用网络命令使用

ipconfig命令使用&#xff1a; ipconfig可用于显示当前的TCP/IP配置的设置值&#xff0c;通常是用来检验人工配置的TCP/IP设置是否正确。在网络连接出现问题时&#xff0c;可以使用ipconfig /release和ipconfig /renew命令来刷新IP地址&#xff0c;这通常能解决因IP地址冲突或…...

双系统下 ubuntu 20.04 突然 开机黑屏报错 hdaudioC0D2: unable to configure disabling

双系统下 ubuntu 20.04 突然 开机黑屏报错 hdaudioC0D2: unable to configure disabling 简介:今天在开实验室开双系统台式机时,ubuntu 20.04 系统下,突然在某次关机后再开机时,本来启动好好的,但是在进行图形化启动时,本来应该是显示输入账号和密码时,直接黑屏报错了,…...

easyExcel导入导出convert

easyExcel版本2.2.7&#xff0c;3.0及以上使用不一致 类上加注解 ExcelProperty(value "下发类型",converter ComponentPurchaseBomExceladvanceStatusConvert.class)private Integer advanceStatus; 转换类 import com.alibaba.excel.converters.Converter; impo…...

C语言高频面试题——指针函数和函数指针的区别

在 C 语言中&#xff0c;指针函数 和 函数指针 是两个容易混淆的概念&#xff0c;但它们的功能和用途完全不同。以下是详细的对比分析&#xff0c;帮助你彻底理解它们的区别。 1. 指针函数&#xff08;Function Returning a Pointer&#xff09; 定义 指针函数 是一个返回值为…...

软考中级-软件设计师 知识点速过1(手写笔记)

第一章&#xff1a;数值及其转换 没什么可说的&#xff0c;包括二进制转八进制和十六进制 第二章&#xff1a;计算机内部数据表示 真值和机器数&#xff1a; 原码&#xff08;后面都拿x -19举例) &#xff1a; 反码&#xff1a; 补码&#xff1a; 移码&#xff1a; 定点数…...

【美化vim】

美化vim 涉及文件一个例子 涉及文件 ~/.vimrc修改这个文件即可 一个例子 let mapleader ,set number " 显示行号"set relativenumber " 显示相对行号set incsearch " 实时开启搜索高亮set hlsearch " 搜索结果高亮set autoinden…...

Dash框架深度解析:数据驱动型Web应用的Python化革命

一、Dash的定位与技术基因 Dash作为Python生态中的现象级框架,重新定义了数据科学家与Web应用开发之间的边界。它以**“零前端”**为核心设计理念,将React的组件化思想、Plotly的可视化能力与Flask的轻量化服务完美融合,使得Python开发者无需深入JavaScript技术栈即可构建交…...