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

C++ 设计模式

文章目录

  • 类图
    • 泛化
    • 实现
    • 关联
    • 聚合
    • 组合
    • 依赖
    • 总结
  • 类内部的三种权限(公有、保护、私有)
  • 类的三种继承方式
    • 描述与图
    • 总结
  • 面向对象七大原则
    • 单一职责原则(Single Responsibility Principle)
    • 里氏替换原则(Liskov Substitution Principle)
    • 依赖倒置原则(Dependence Inversion Principle)
    • 接口隔离原则(Interface Segregation Principle)
    • 迪米特法则(Law Of Demeter)
    • 开闭原则(Open Close Principle)
    • 组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)
  • 关于类的静态成员
  • 类的静态成员函数
  • 关于C++构造函数的继承问题
  • C++虚函数
  • 个人总结
  • 创建型模式
    • Factory模式(工厂模式)
    • AbstractFactory模式(抽象工厂模式)

类图

泛化

  • 【泛化】是一种继承关系,表示一般与特殊的关系,它指定了子类如何继承父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
  • 【代码体现】:继承。
  • 特征:空白三角形+实线 指向父类
    动物是老虎的父类

实现

  • 【实现关系】是一种类与接口的关系,表示类是接口所有特征和行为的实现。

  • 特征:空白三角形箭头+虚线 箭头指向接口
    在这里插入图片描述

  • 【代码体现】:纯虚函数

  • 对于C++,其接口类一般具有以下特征:

    • 最好不要有成员变量,但可以有静态常量(static const或enum)
      • 如果成员变量,尤其是可变的成员变量,定义在接口中,等于是把实现细节暴露出来了,不符合接口定义的要求,所以一般不在接口中定义可变的成员变量。
        而常量可以定义在接口中,因为有时接口需要返回状态,而这些状态可以定义成常量放在接口中。
    • 要有纯虚接口方法
      • 由于不能让接口类自身能够实例化,并且需要子类必须实现接口暴露的方法,所以接口方法都要声明成纯虚函数。
        声明成纯虚函数意味着接口类自身不需要提供方法的定义,方法的定义需要由接口类的子类提供,并且接口类自身也因此变成了抽象类而不能被实例化。
    • 要有虚析构函数,并提供默认实现
      • 在使用接口类的指针访问接口类的子类的实例时,当对接口类的指针做delete时,如果接口类的析构函数不是虚析构函数的话,将只会调用接口类(父类)的析构函数,接口类的子类的析构函数将不会被调用,内存泄露将会产生,所以接口类的析构函数必须定义成虚析构函数。
      • 如果接口类的析构函数不提供默认实现,即如果接口类的析构函数是纯虚析构函数的话,接口类的子类将被迫必须提供析构函数的实现,这样对接口类的子类不友好。
    • 不要声明构造函数
      • 不要显式定义任何的构造函数,但也不要在接口中加入如下代码来禁止生成构造函数:
      • Testable() = delete; Testable(const Testable&) = delete;
      • 因为C++的调用机制要求子类的构造函数调用时一定会先调用父类的构造函数,如果禁止生成父类构造函数,代码编译时会报错。如果程序员不显式的提供构造函数,编译器也会隐式的加上构造函数的,虽然这些构造函数对于接口类来说实际没有什么意义。
    • 例子:
class Testable
{
public:static const int START = 1;  // #1static const int STOP = 2;virtual void test() = 0;  // #2: 接口方法virtual ~Testable() {};   // #3: 从C++11开始可以: virtual ~Testable() = default;
}

关联

  • 【关联关系】是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
  • 【代码体现】:成员变量
  • 特征:实线 n n实线 1 n 箭头指向被拥有者
    在这里插入图片描述
  • 上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。

聚合

  • 【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
  • 【聚合关系】是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
  • 特征:菱形+实线+箭头在这里插入图片描述

组合

  • 【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门

  • 组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
    在这里插入图片描述

依赖

  • 【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.
  • 【代码表现】:局部变量、方法的参数、对静态方法的调用、函数返回值
  • 【箭头及指向】:带箭头的虚线,指向被使用者。
    在这里插入图片描述

总结

各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
下面这张UML图,比较形象地展示了各种类图关系:
在这里插入图片描述

类内部的三种权限(公有、保护、私有)

在这里插入图片描述
权限按照以下两点递减:

  • 是否能被外部访问
  • 是否能被继承的子类访问

类的三种继承方式

描述与图

  • public继承方式
    基类中所有 public 成员在派生类中为 public 属性;
    基类中所有 protected 成员在派生类中为 protected 属性;
    基类中所有 private 成员在派生类中不能使用。

  • protected继承方式
    基类中的所有 public 成员在派生类中为 protected 属性;
    基类中的所有 protected 成员在派生类中为 protected 属性;
    基类中的所有 private 成员在派生类中不能使用。

  • private继承方式
    基类中的所有 public 成员在派生类中均为 private 属性
    基类中的所有 protected 成员在派生类中均为 private 属性
    基类中的所有 private 成员在派生类中不能使用。

继承方式/基类成员public成员protected成员private成员
public继承publicprotected不可见
protected继承protectedprotected不可见
private继承privateprivate不可见

总结

  • 父类的private成员在子类不能使用、不可见
  • 父类的成员在子类中的权限,最高为其子类的继承方式。

面向对象七大原则

单一职责原则(Single Responsibility Principle)

  • 每一个类应该专注于做一件事情
  • 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;提高类的可读性,提高系统的可维护性;变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。需要说明的一点是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则。

里氏替换原则(Liskov Substitution Principle)

  • 子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏
  • 使用里氏替换原则时需要注意,子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。

依赖倒置原则(Dependence Inversion Principle)

  • 程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
  • 面向抽象编程,也就是面向抽象类或接口编程。

接口隔离原则(Interface Segregation Principle)

应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。

迪米特法则(Law Of Demeter)

又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。

开闭原则(Open Close Principle)

面向扩展开放,面向修改关闭。

组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)

尽量使用合成/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。

关于类的静态成员

  • 类的静态成员与类本身直接相关而不是与类的各个对象保持关联

  • 我们不能在类的内部初始化静态数据成员必须在类的外部初始化
    在这里插入图片描述
    在这里插入图片描述

  • 字面值常量类型constexpr除外
    在这里插入图片描述

类的静态成员函数

在这里插入图片描述

/*类静态成员、静态成员函数例子如下*/
#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;class Guest{
private:static int m_num;static int m_count;static double m_totalFee;string name;int num;double fee;
public:Guest(string name, double fee):name(name),fee(fee){m_num++;num = m_num;m_count++;m_totalFee+=fee;}~Guest(){m_count--;}void show() const{printf("num:%d,name:%s,fee:%.2lf\n",num,name.c_str(),fee);}static int GetCount(){return m_count;}static double GetTotalIncome(){return m_totalFee;}
};int Guest::m_num = 0;
int Guest::m_count = 0;
double Guest::m_totalFee = 0;int main(int argc, char *argv[])
{Guest g1("lihua",11.99), g2("zhangsan",12.99), g3("xiaomei",13.99);g1.show();g2.show();g3.show();printf("count:%d,totalFee:%.2f\n",Guest::GetCount(),Guest::GetTotalIncome());return 0;
}

关于C++构造函数的继承问题

  • 构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,子类需要调用其父类的构造方法
  • 如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建
  • 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式
#include <iostream.h>  class animal  {  public:  animal(int height, int weight)   //有且仅有 有参参数,必须显性调用{  cout<<"animal construct"<<endl;  }};  class fish:public animal  {  public:  fish():animal(400,300)  {  cout<<"fish construct"<<endl;  }};  void main()  {  fish fh;  }  
  • 在fish类的构造函数后,加一个冒号(:),然后加上父类的带参数的构造函数。这样,在子类的构造函数被调用时,子类就会去调用父类的带参数的构造函数去构造对象

C++虚函数

传送门

个人总结

  • 继承时,父类的构造函数和析构函数不会被子类继承,但会在子类调用构造函数前和子类调用析构函数后调用。顺序如下:父类构造函数,子类构造函数。 子类析构函数,父类析构函数。(想象建造一座楼,父类在下,子类在上。从下往上建,从上往下拆)
  • 假设有父类Shape,子类Circle,调用如下代码
	Shape *a = new Circle();delete a;

在这里插入图片描述

new Circle()时,将会调用Circle(子类)的构造函数,delete a时,由于指针a是基类,将只会调用父类的析构函数,所以我们必须实现多态(用虚函数),使得对象为Circle时,delete会调用子类的析构函数。方法是将析构函数声明为虚函数

  • 声明虚函数时,每个类会有一个虚函数表,子类继承父类时,会覆盖父类的虚函数表的函数指针。若一个函数是虚函数,则会去虚函数表里找到函数指针来去实现它。

创建型模式

Factory模式(工厂模式)

在这里插入图片描述

//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
class Product
{
public:virtual ~Product() = 0; //多态时,调用子类的析构函数
protected:Product();     //不可被外部调用,抽象基类不可以被实例化
private:
};class ConcreteProduct:public Product
{
public:~ConcreteProduct();ConcreteProduct();
protected:
private:
};
#endif
//Product.cpp
#include "Product.h"
#include <iostream>
Product::Product()
{std::cout<<"Product()...."<<std::endl; 
}Product::~Product()
{std::cout<<"~Product()...."<<std::endl; 
}ConcreteProduct::ConcreteProduct()
{std::cout<<"ConcreteProduct()...."<<std::endl; 
}ConcreteProduct::~ConcreteProduct()
{std::cout<<"~ConcreteProduct()...."<<std::endl; 
}
//Factory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_
class Product;
//factory抽象基类
class Factory   
{
public:virtual ~Factory() = 0;         //析构函數virtual Product* CreateProduct() = 0;   
protected:Factory();      //构造函数,外部不可以调用,子类可以调用
private:
};//factory实例
class ConcreteFactory:public Factory
{
public:~ConcreteFactory();         ConcreteFactory();Product* CreateProduct();
protected:
private:
};
#endif
//Factory.cpp
#include "Product.h"
#include "Factory.h"
#include <iostream>Factory::Factory()
{std::cout<<"Factory()...."<<std::endl; 
}Factory::~Factory()
{std::cout<<"~Factory()...."<<std::endl; 
}ConcreteFactory::ConcreteFactory()
{std::cout<<"ConcreteFactory()......"<<std::endl;
}ConcreteFactory::~ConcreteFactory()
{std::cout<<"~ConcreteFactory()......"<<std::endl;
}Product* ConcreteFactory::CreateProduct()
{return new ConcreteProduct();
}
//main.cpp
#include "Factory.h"
#include "Product.h"
#include <iostream>
#include <cstdio>
int main(int argc, char* argv[])
{Factory *fac = new ConcreteFactory();Product* p = fac->CreateProduct();delete p;delete fac;return 0;
}
#makefile
CC = g++ -g
BaseIncludePath = ../include/
SRCS = main.cpp Product.cpp Factory.cpp
OBJS = $(addsuffix .o,$(basename ${SRCS}))main.exe: $(OBJS)$(CC) $(OBJS) -o main.exe %.o: %.cpp$(CC) -c $< -o $@ -I$(BaseIncludePath)clean:del $(OBJS) main.exe

AbstractFactory模式(抽象工厂模式)

在这里插入图片描述

  • 抽象工厂模式和工厂方法模式一样,都符合开闭原则。但是不同的是,在抽象工厂模式中,增加一个产品族很容易,而增加一个产品等级结构却很难,工厂模式则反之。

  • 也就是说,在抽象工厂模式中,增加一个具体的工厂很容易,但是你想在工厂中多生产一种产品,就需要修改很多个类,会违背开闭原则,这种情况下应该使用工厂模式。

  • 简单来说:工厂模式新增产品类型容易,抽象工厂模式新增工厂类型容易

表头表头
单元格单元格
单元格单元格

相关文章:

C++ 设计模式

文章目录 类图泛化实现关联聚合组合依赖总结 类内部的三种权限&#xff08;公有、保护、私有&#xff09;类的三种继承方式描述与图总结 面向对象七大原则单一职责原则&#xff08;Single Responsibility Principle&#xff09;里氏替换原则&#xff08;Liskov Substitution Pr…...

安卓使用ExoPlayer出现膨胀类异常

1.导包 implementation com.google.android.exoplayer:exoplayer-core:2.15.1implementation com.google.android.exoplayer:exoplayer-ui:2.15.1 2.在Androidifest.xml加入权限&#xff0c;我这里加了网络与读写权限 <uses-permission android:name"android.permissio…...

C++之析构函数

在 C 中&#xff0c;析构函数&#xff08;Destructor&#xff09;是一个特殊的成员函数&#xff0c;用于在对象生命周期结束时执行清理工作和资源释放。析构函数的名称与类名相同&#xff0c;前面加上波浪号&#xff08;~&#xff09;&#xff0c;不接受任何参数&#xff0c;也…...

108. 将有序数组转换为二叉搜索树【简单】

108. 将有序数组转换为二叉搜索树【简单】 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉…...

vue3中watch和watchEffect的区别!!!

vue3中watch和watchEffect的区别&#xff01;&#xff01;&#xff01; 在 Vue 3 中&#xff0c;watch 和 watchEffect 都是监听器&#xff0c;但在写法和使用上有所区别。让我们来详细了解一下它们之间的不同&#xff1a; watch: watch 具有一定的惰性&#xff08;lazy&#…...

【JavaEE初阶 -- 计算机核心工作机制】

这里写目录标题 1.冯诺依曼体系2.CPU是怎么构成的3.指令表4.CPU执行代码的方式5.CPU小结&#xff1a;6.编程语言和操作系统7. 进程/任务&#xff08;Process/Task&#xff09;8.进程在系统中是如何管理的9. CPU分配 -- 进程调度10.内存分配 -- 内存管理11.进程间通信 1.冯诺依曼…...

springcloud:3.6测试信号量隔离

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…...

AI化未来:智能科技的新纪元

AI化未来&#xff1a;智能科技的新纪元 我们正处在一个前所未有的科技革新时期&#xff0c;人工智能&#xff08;AI&#xff09;的发展正日益渗透到我们生活的方方面面&#xff0c;预示着AI化未来的到来。这是一场前所未有的科技革命&#xff0c;其深度和广度超越了历史上的任…...

Unity 整体界面淡入淡出效果

在Unity中&#xff0c;如果我们要实现控制多个组件同时淡出&#xff0c;同时淡入的效果&#xff0c;可以使用DOTween插件实现。 如图&#xff0c;一个页面中带有背景&#xff0c;一张图片&#xff0c;一个文本&#xff0c;一个滑动条。 要实现以上界面的整体淡入淡出&#xff…...

反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打开题目 题目源码&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&qu…...

JavaScript中的包装类型详解

JavaScript中的包装类型详解 在 JavaScript 中&#xff0c;我们有基本类型和对象类型两种数据类型。基本类型包括 String&#xff0c;Number&#xff0c;Boolean&#xff0c;null&#xff0c;undefined 和 Symbol。然而&#xff0c;当我们需要在这些基本类型上调用方法时&…...

如何向各大媒体网站投稿 海外媒体发稿平台有哪些

在数字化时代&#xff0c;各大媒体网站是企业推广和个人展示的重要平台。通过在媒体网站上发布文章&#xff0c;可以有效地扩大影响力和提升知名度。但是&#xff0c;如何投稿到各大媒体网站呢&#xff1f;以下是一些常用的方法和步骤。 1. 研究目标媒体 在投稿之前&#xff0…...

基于SpringBoot的论坛系统(附项目源码+论文)

摘要 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在世界上遥遥领先&#xff0c;让人们感觉到处于信息大爆炸的社会。信息时代的信息处理肯定不能用之前的手工处理这样的解决方法&#xf…...

堆以及堆的实现

文章目录 堆的概念堆的实现HeapPushHeapPop HeapTop HeapSize HeapEmpty堆的应用 堆的概念 堆是一颗完全二叉树每个结点的值都小于子结点的值&#xff0c;这颗二叉树为小根堆每个结点的值都大于子结点的值&#xff0c;这颗二叉树为大根堆堆的定义如下&#xff1a;n个元素的序列…...

使用RabbitMQ实现延时消息自动取消的简单案例

一、流程图 二、导包 <!--消息队列 AMQP依赖&#xff0c;包含RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 三、配置文件 #消息队列 …...

Docker部署(ruoyi案例接上篇Docker之部署前后端分离项目)实施必会!!!!

文章目录 Docker部署前端 Docker部署前端 接上篇博主已经部署好后端Docker部署后端&#xff0c;现在来讲解怎么部署前端 MySQL和redis是不依赖其他任何一个东西的&#xff0c; ruoyi-admin是因为你启动项目的时候是必须连接数据库的 现在去单独启动它 docker start ruoyi-a…...

电脑中已经有多个模组压缩文件,如何通过小火星露谷管理器批量安装

如果已经下载了很多的星露谷模组压缩文件&#xff08;zip包&#xff09;&#xff0c;可以通过【添加模组】功能&#xff0c;将模组批量解压到Mods文件夹中。 名词解释 为了避免这篇文章的内容看不懂&#xff0c;先解释两个名词。 直装型模组&#xff1a;直接解压到Mods就能生…...

[Linux]如何理解kernel、shell、bash

文章目录 概念总览kernelshell&bash 概念总览 内核(kernel) &#xff0c;外壳(shell) &#xff0c;bash kernel kernel是指操作系统中的核心部分&#xff0c;用户一般是不能直接使用kernel的。它主要负责管理硬件资源和提供系统服务&#xff0c;如内存管理、进程管理、文件…...

C++:Vector的使用

一、vector的介绍 vector的文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以…...

Redis之事务(详细解析)

请直接看原文:不能回滚的Redis事务还能用吗 - 知乎 (zhihu.com) ------------------------------------------------------------------------------------------------------------------------------ 1、Redis事务的概念&#xff1a; Redis 事务的本质是一组命令的集合。…...

Java项目:39 springboot007大学生租房平台的设计与实现

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统有管理员、房东和用户 【主要功能】 1、后台&#xff1a;房源管理、信息审批管理、订单信息管理、房东管理、用户管理 2、前台&#xff1…...

安卓内存信息查看

目录 前言一、Android查看内存相关信息的方法1.1 通过 adb shell 获取内存信息1.2 通过编程方式获取内存信息1.3 adb shell 获取应用程序内存使用情况1.4 free指令 二、总结 前言 一、Android查看内存相关信息的方法 1.1 通过 adb shell 获取内存信息 C:\Users\henry.xue>…...

Positional Encoding 位置编码

Positional Encoding 位置编码 flyfish Transformer模型没有使用循环神经网络&#xff0c;无法从序列中学习到位置信息&#xff0c;并且它是并行结构&#xff0c;不是按位置来处理序列的&#xff0c;所以为输入序列加入了位置编码&#xff0c;将每个词的位置加入到了词向量中…...

MySql、Navicat 软件安装 + Navicat简单操作(建数据库,表)

一、MySql、Navicat 软件安装 及正常使用 MySql下载&#xff0b;安装&#xff1a; 检查安装情况&#xff1a; 配置环境变量&#xff1a; 搞定了&#xff01;&#xff01;&#xff01; 可以登陆试哈哈哈 连接navicat 开始创建数据库 二、 商品种类表 - commoditytype int …...

逆向案例五、爬取b站评论,表单MD5加密

1.便捷写爬虫网站&#xff1a; Convert curl commands to code 使用流程&#xff1a;又点击想要抓的包&#xff0c;复制URL&#xff08;base&#xff09;格式复制 在上面链接中粘贴即可 2.找到含有评论的包&#xff08;即main?oid)&#xff1a;观察表单发现两处参数在变化&…...

010-原型链

原型链 1、概念2、原理3、new 操作符原理4、应用 1、概念 原型链&#xff1a;javascript的继承机制&#xff0c;是指获取JavaScript对象的属性会顺着其_proto_的指向寻找&#xff0c;直至找到Object.prototype上。 2、原理 &#x1f4a1; Tips&#xff1a;构造函数 Fn&#…...

Electron-builder打包安装包——编译篇

突然有一天想打包个桌面程序&#xff0c;没有打包过&#xff0c;经过九牛二虎之力终于打包出来&#xff0c;在此感谢那些热于分享的前辈&#xff01; 本篇只讲打包运行和出现的问题 一、准备工作&#xff1a;提前下载相关资源包&#xff0c;否则在国内环境下可能因为网络问题…...

Red Hat系统升级内核版本

查看当前内核版本 uneme -r yum list kernel升级内核 yum update -y kernel检查升级后的内核版本 uneme -r yum list kernel升级系统中已安装的软件包到最新版本&#xff08;过程时间较长&#xff09; 目前只升级了系统内核&#xff0c;系统相关的安装包还是老的&#xff0…...

Java集合set之HashSet、LinkedHashSet、TreeSet的区别?

Java的集合中主要由List&#xff0c;Set&#xff0c;Queue&#xff0c;Map构成&#xff0c;Set特点&#xff1a;存取无序&#xff0c;不可以存放重复的元素&#xff0c;不可以用下标对元素进行操作。 HashSet 作为Set容器的代表子类&#xff0c;HashSet经常被用到&#xff0c…...

全方位碾压chatGPT4的全球最强模型Claude 3发布!速通指南在此!保姆级教学拿脚都能学会!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…...