【Java】/*抽象类和接口*/

目录
一、抽象类和抽象方法
1.1 概念
1.2 特性
1.3 作用
二、接口
2.1 概念及定义
2.2 特性
2.3 实例:笔记本电脑
2.4 一个类可以实现多个接口
2.5 一个接口可以继承多个接口
2.6 Comparable接口
2.7 Comparator接口
2.8 Cloneable接口
2.9 浅拷贝和深拷贝
2.10 抽象类和接口的区别
三、Object类
3.1 概念
3.2 获取对象信息
3.3 对象比较equals方法
2.4 hashcode方法
一、抽象类和抽象方法
1.1 概念
1. 抽象类:如果一个类没有足够的信息来描述一个对象(这个类通常是父类),那么这个类可以用abstract修饰成为抽象类。
2. 抽象方法:抽象类中被abstract修饰的方法称为抽象方法,抽象方法可以不具体实现。
1.2 特性
① 抽象类也是类,内部可以有成员和构造方法等,也可以发生向上转型,方法重写,多态。
② abstract不能修饰被private、static、final修饰的方法,因为抽象方法要被子类重写(被重写的方法要满足能被重写的条件)
③ 抽象方法可以不具体实现,如果具体实现了反而会报错。
④ 如果一个类中包含抽象方法,那么这个类必定是抽象类;但抽象类中不一定有抽象方法。
⑤ 抽象类不能实例化对象,只能被继承(和被final修饰的类效果相反),并且继承抽象类的子类A必须要重写抽象类中的抽象方法,如果不重写,得将子类A也得写成抽象类,那么当子类B继承子类A后就得重写子类A的父类和子类A中所有没被重写的方法(出来混总是要还的)。
/*抽象方法*/
abstract class Father {/*抽象类*/public abstract void funcA();
}/*抽象方法*/
abstract class Son extends Father {/*抽象类*/public abstract void funcB();
}class GrandSon1 extends Son {/*重写Father类中的抽象方法*/@Overridepublic void funcA() {System.out.println("我是爷爷的第一个孙子");}/*重写Son类中的抽象方法*/@Overridepublic void funcB() {System.out.println("我是爸爸的第一个儿子");}
}class GrandSon2 extends Son {/*重写Father类中的抽象方法*/@Overridepublic void funcA() {System.out.println("我是爷爷的第二个孙子");}/*重写Son类中的抽象方法*/@Overridepublic void funcB() {System.out.println("我是爸爸的第二个儿子");}
}public class Test01 {public static void funcDemo1(Father father) {//向上转型成Father类,只能调用Father类有的成员father.funcA();}public static void funcDemo2(Son son) {//向上转型成Son类,由于Son类继承了Father类,//此时能调用Father类和Son类有的成员,//所以无论在抽象类有没有继承抽象类的情况下//记住向上转型成最后一个抽象类即可son.funcA();son.funcB();}public static void main(String[] args) {GrandSon1 grandSon1 = new GrandSon1();GrandSon2 grandSon2 = new GrandSon2();//Test01.funcDemo1(grandSon1);//Test01.funcDemo1(grandSon2);Test01.funcDemo2(grandSon1);Test01.funcDemo2(grandSon2);}
}
1.3 作用
抽象类本身不能被实例化,要想使用只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。有些人可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢? 确实如此,但是使用抽象类相当于多了一重编译器的校验。使用抽象类的场景就如上面的代码, 实际工作不应该由父类的方法完成, 而应由子类重写的方法完成,那么如果不小心忘记在子类中重写父类中的方法了,在方法调用的过程中父类使用普通类编译器是不会报错的,但是父类是抽象类就会在子类继承父类后提示需要重写父类中的方法, 让我们尽早发现代码中的逻辑问题。
很多语法存在的意义都是为了 "预防出错",例如我们曾经用过的 final 也是类似。创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们。充分利用编译器的校验, 在实际开发中是非常有意义的。
二、接口
2.1 概念及定义
概念:接口(英文:Interface),在JAVA编程语言中是一个抽象引用数据类型,是抽象方法的集合,接口用interface关键字来定义。
定义:
① 定义接口要使用interface关键字(接口并不是类)。
② 接口的命名一般以大写字母I开头,并且命名一般使用形容词性的单词。
③ 接口中的成员可以有成员变量和成员方法,但成员变量必须是public static final修饰的,成员方法必须是public abstract修饰的(也就是说,接口中的成员变量必须是公开可以使用的常量,接口中的成员方法必须是抽象方法),阿里编码规范中约定,接口中的方法和属性不要加任何的修饰符号,因此我们在写接口中的成员时可以不写前面的修饰,编译器会自动修饰。
④ 接口前面不要用abstract修饰,因为接口本身比抽象类更抽象。
类实现接口的格式:
2.2 特性
① 抽象类和接口都不能实例化对象,抽象类用来被类继承,接口用来被类实现。
② 当一个类实现一个接口时意味着要在这个类中重写接口中所有抽象方法,如果在这个类中不想重写,则这个类必须定义成抽象类,继承这个抽象类的类得重写接口和这个抽象类中的所有抽象方法。
③ 接口也可以发生向上转型,动态绑定,多态(动态绑定是原理,多态是思想)。
④ 接口定义好后也会有一个单独的Java文件,编译完成后生成的字节码文件的后缀也是(.class)。
⑤ 接口中不能有静态代码块,构造代码块,构造方法等。
⑥ 重写接口中的方法时,方法只能是public修饰的(因为重写方法的权限要大于等于重写前的权限,而接口中的成员方法默认是public的)。
⑦ 接口中被 default 或 static 修饰的方法要写清楚具体实现的语句,且被实的接口中default成员方法可以不重写,也可以被重写,并不会像接口中的抽象方法一样强制要重写。
2.3 实例:笔记本电脑
实现笔记本电脑使用USB鼠标、USB键盘的例子
1. USB接口:包含打开设备、关闭设备功能
2. 笔记本类:包含开机功能、关机功能、使用USB设备功能
3. 鼠标类:实现USB接口,并具备点击功能
4. 键盘类:实现USB接口,并具备输入功能


2.4 一个类可以实现多个接口
1. 在Java中,类和类之间只能是单继承的,也就是说一个类只能有一个父类,但一个类可以实现多个接口,从而间接达到实现多继承的目的。
2. 一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
3. 例如:根据我们当前掌握的知识当我们想要描述狗、鱼、鸭这三种动物时,我们会定义狗、鱼、鸭这三个类,并且由于它们之间共属于动物,我们可以定义一个父类Animal,从而达到代码复用的效果。但是在定义的过程中我们会发现一个问题,游泳、跑步、飞行这三个行为,如果我们把它们定义在父类Animal中并不稳妥,因为继承是对子类共性的抽取,并不是所有的动物都同时具备这三个行为;如果我们把它们定义在狗、鱼、鸭的各自类中,这又会造成代码冗余;如果我们把它们定义在一个新的类A中,当我们定义狗、鱼、鸭类时又会发现类是不支持多继承的,继承了Animal类就不能再继承A类了。在这种场景下,我们把游泳、跑步、飞行这三个行为定义在一个接口中最为合适,这样子类既可以继承Animal类也可以根据需要拥有游泳/跑步/飞行这三个行为,而且不会造成代码冗余。于是我们可以写下如下图代码,该代码展示了 Java 面向对象编程中最常见的用法:一个类继承一个父类, 同时实现了多个接口。
4. 使用接口的好处:让程序员忘记类型。例如,下图中用绿色方框框起来的方法,参数部分采用了向上转型传参数的方式,在调用该方法传参时程序员可以不用考虑传入的参数是什么类,只需要关心传入的参数的类中是否实现了对应的接口。


2.5 一个接口可以继承多个接口
1. 一个接口可以继承多个接口,从而达到复用的效果,关键字也是extends。
2. 接口的继承相当于把多个接口合并在一起。
3. 下图代码中接口C继承了接口A、B,实现接口C的TestNew类要重写接口A、接口B、接口C中所有的抽象方法,否则TestNew类得定义成抽象类。


2.6 Comparable接口
1. 关系运算符只能比较基本数据类型数据的大小,引用数据类型的数据比较大小要用到Comparable接口中的compareTo方法。
2. 具体做法:为将要比较大小的引用数据类型的对象它对应的类实现Comparable接口,在类中重写接口中的compareTo方法,compareTo方法的内部自定义根据类的哪一种成员变量进行比较。我们在比较该引用数据类型的对象的大小时,直接用对象的引用调用compareTo方法并传参即可,不用定义一个新的方法使用向上转型(这样写有点多此一举了),举例代码如下图所示。

3. Arrays.sort方法在排序装有引用数据类型的数组时,会先将数组中的元素强制转换成Comparable类型,然后调用compareTo方法比较两个相邻数据的大小,最后根据比较的结果对数组中相邻两个元素进行位置调整。
这也就是说使用Arrays.sort方法对装有引用数据类型数据的数组进行排序时,也得先让对应引用数据类型的类实现Comparable接口,并在类中重写了compareTo方法后才能正常进行排序,且值得注意的是,也就是说Arrays.sort排序的逻辑与compareTo内部实现比较大小的依据有着极大的关联,当compareTo内部根据年龄、姓名等比较大小时可能会造成不同的排序结果。
4. 使用Comparable接口中的compareTo方法来比较两个引用数据类型的大小的局限性在于,一旦把compareTo中的内容写下了之后,以后在比较该引用数据类型对象的大小时调用compareTo方法只能按照compareTo方法中依据的东西判断大小了。


5. 写一个自己的sort方法,实现和Arrays.sort方法一样的功能(采用冒泡排序):


2.7 Comparator接口
1. 针对Comparable接口的局限性,在比较某个类实例化的两个对象的大小时,我们可以采用实现Comparator接口对里面的compare方法进行重写,而不去采用实现Comparable接口。
2. 具体做法:重新定义新的类(A)去实现Comparator接口,<>里面写上要比较的类,使用时直接new一个A类的对象a,使用a调用compare方法并传参即可;我们可以按照这种方式写多个比较器来达到目的;如果Comparator接口由比较对象的类实现,则会达不到想要的效果,如下图二所示。


3. 我们在调用Arrays.sort方法时也可以将比较器作为参数传递给sort方法,使得sort方法在排序装有引用数据类型的数组时,比较相邻的两个元素的大小采用比较器中的compare方法,而不再采用Comparable中的compareTo方法。


2.8 Cloneable接口
1. 使用场景:想要克隆某个对象时。
2. 实现步骤:
① 给该对象对应的类实现Clonable接口,但并不用重写Cloneable中的接口,因为这个接口里面并没有抽象方法,此时这个接口叫做空接口/标记接口,这种接口的意义在于只有实现了该接口才能证明你有该功能,除此之外没有什么特殊的意义。
② 调用Object类中的clone方法。但我们不能直接调用,因为Object类中的clone方法被protected修饰了,此时是不能在不同包的非子类中使用的,
于是我们可以先在子类中重写Object的克隆方法,在这个重写的克隆方法内部直接返回原来克隆方法的返回值即可,因为我们调用克隆方法的目的本来就是得到克隆后对象的地址,在不同包的子类中是可以调用Object的clone方法的。
-》补充:在子类中快速重写Object类中方法的快捷方式
3. 由于clone方法的返回值是Object类型的,因此在接收clone方法的返回值时,要强制类型转换一下(Object类是所有类的父类,这里要发生向下转型)。
4. 当上面的步骤都做好后,代码运行时还会报错,此时是由于异常原因,解决的方法是,在main方法参数列表的后面加上clone方法参数列表后的“throws CloneNotSupportedException”即可,异常问题后面的文章中会讲到。
-》下图是示例代码:

-》上图代码在内存中的示意图:

2.9 浅拷贝和深拷贝
1. 浅拷贝:修改上文Cloneable接口中的代码,即给Student类增加一个成员变量(该成员变量是Money类创建的一个对象),并保持其他的代码不变。代码和代码在内存中的示意图如下图所示。
我们会发现一个问题,克隆出的student2中成员变量m指向的对象和student1中成员变量m指向的对象一样,当我们在修改student1/student2中m对象的money值时,student1和student2中m对象的money值都会变,这种现象被称为浅拷贝(并没有实现真正的拷贝效果)。
2. 深拷贝:为了实现真正的拷贝效果,我们可以修改上述代码中重写的clone方法来达到目的。具体操作是,在Student类重写的clone方法中先调用Object类中的clone方法,克隆一下this所指向的对象,并让临时的Student类对象tmp来接收,然后为Money类实现Cloneable接口并重写clone方法,接着克隆一下this中的m对象,并让tmp中的m接收,最后返回tmp即可达到真正的拷贝效果,代码和代码在内存中的分析如下图所示。
2.10 抽象类和接口的区别
1. 抽象类和接口都是 Java 中多态的常见使用方式。
2. 核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中 不能包含普通方法, 子类必须重写所有的抽象方法。
3. 再次提醒: 抽象类存在的意义是为了让编译器更好的校验, 像 Animal 这样的类我们并不会直接使用, 而是使用它的子类. 万一不小心创建了 Animal 的实例, 编译器会及时提醒我们。
三、Object类
3.1 概念
1. Object类是所有类的父类。
2. 对于整个Object类中的方法需要实现全部掌握,本小节当中,我们主要来熟悉这几个方法:toString()方法,equals()方法,hashcode()方法。
3. 在ideal中如何看到Object类中所有的方法?
做法:双击shift,在出现的对话框中勾选Include non-project items,并在搜索框中搜索Object,点击第一个Object,然后在ideal页面的左下角点击Structure即可看到Object类中的所有的方法。
3.2 获取对象信息
如果要打印对象的信息,可以通过重写Object类中的toString()方法,在打印时:对于单个对象直接用sout打印对象的名称即可,对于装有多个对象的数组来说用sout打印Arrays.toString的返回值即可,具体示例代码如下图所示。


3.3 对象比较equals方法
1. Object类中的equals方法的功能是比较两个引用所指向的对象是否为同一个对象,如果是就返回true,否就返回false,并且Object类中的equals方法是用public修饰的哦~。
2. 也就是说当我们想比较两个对象中的内容是否相同时得重写Object类中的equals方法。并且ideal提供了快捷方式,具体做法:单机右键,Generate,点击equals() and hashCode(),然后一路next。
2.4 hashcode方法
1. toString方法的源码中有一个hashCode()方法,它可以帮我们算一个具体的对象位置(我们可以暂时理解为内存地址)。Integer.toHexString()方法,可以将这个地址以16进制输出。
2. hashCode()方法是一个native方法,底层是由C/C++代码写的,所以我们看不到。
3. 如果在某个业务场景中我们需要实现,如果对象的成员变量都一致,我们就认为是同一个人的话,我们可以通过重写hashCode方法来达到目的。ideal提供了快捷方式,具体做法:单机右键,Generate,点击equals() and hashCode(),然后一路next。
4. 重写hashCode前:
![]()
重写hashCode后:
本篇文章已完结,谢谢支持哟 ^^ !!!

相关文章:
【Java】/*抽象类和接口*/
目录 一、抽象类和抽象方法 1.1 概念 1.2 特性 1.3 作用 二、接口 2.1 概念及定义 2.2 特性 2.3 实例:笔记本电脑 2.4 一个类可以实现多个接口 2.5 一个接口可以继承多个接口 2.6 Comparable接口 2.7 Comparator接口 2.8 Cloneable接口 2.9 浅拷贝和深…...
TCP/IP协议介绍——三次握手四次挥手
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议…...
[C++]基于C++opencv结合vibe和sort tracker实现高空抛物实时检测
【vibe算法介绍】 ViBe算法是一种高效的像素级视频背景建模和前景检测算法。以下是对该算法的详细介绍: 一、算法原理 ViBe算法的核心思想是通过为每个像素点存储一个样本集,利用该样本集与当前像素值进行比较,从而判断该像素是否属于背景…...
Apache Doris 基础 -- 数据表设计(模式更改)
用户可以通过schema Change操作修改现有表的模式。表的模式主要包括对列的修改和对索引的修改。这里我们主要介绍与列相关的Scheme更改。对于与索引相关的更改,可以查看数据表设计/表索引,查看每个索引的更改方法。 1、术语 基本表(Base Ta…...
【机器学习】【遗传算法】【项目实战】药品分拣的优化策略【附Python源码】
仅供学习、参考使用 一、遗传算法简介 遗传算法(Genetic Algorithm, GA)是机器学习领域中常见的一类算法,其基本思想可以用下述流程图简要表示: (图参考论文:Optimization of Worker Scheduling at Logi…...
电子电气架构 ---车载安全防火墙
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
解决selenium加载网页过慢影响程序运行时间的问题
在用selenium爬取动态加载网页时,发现网页内容都全部加载完了,但是页面还在转圈,并且获取页面内容的代码也没有执行,后面了解到selenium元素操作等方法是需要等待页面所有元素完全加载完成后才开始执行的,所以在页面未…...
何为云防护?有何作用
云防护又称云防御。随着Internet互联网络带宽的增加和多种DDOS 黑客工具的不断发布,云计算越演越热,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素,导致很多IDC 托管…...
2024050402-重学 Java 设计模式《实战责任链模式》
重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」 一、前言 场地和场景的重要性 射击🏹需要去靶场学习、滑雪🏂需要去雪场体验、开车🚗需要能上路实践,而编程…...
centos7安装字体
1.安装命令 yum install fontconfig #字体库命令 yum install mkfontscale #更新字体命令2.安装字体(注意权限问题) 进入目录 /usr/share/fonts ,该目录是 centos7 字体库的默认安装目录。在该目录下创建一个文件夹 ekp (名字…...
Llama模型家族之使用 ReFT技术对 Llama-3 进行微调(三)为 ReFT 微调准备模型及数据集
LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…...
学习Canvas过程中2D的方法、注释及感悟一(通俗易懂)
1.了解Canvas: Canvas是前端一个很重要的知识点,<canvas>标签用于创建画布绘制图形,通过JavaScript进行操作。它为开发者提供一个动态绘制图形的区域,用于创建图标、游戏动画、图像处理等。 对于能够熟练使用Canvas的开发者…...
《TCP/IP网络编程》(第十三章)多种I/O函数(2)
使用readv和writev函数可以提高数据通信的效率,它们的功能可以概括为**“对数据进行整合传输及发送”**。 即使用writev函数可以将分散在多个缓冲中的数据一并发送,使用readv函数可以由多个缓冲分别接受,所以适当使用他们可以减少I/O函数的调…...
Java集合汇总
Java中的集合框架是Java语言的核心部分,提供了强大的数据结构来存储和操作对象集合。集合框架位于java.util包中,主要可以分为两大类:Collection(单列集合)和Map(双列集合)。下面是对它们的总结…...
度小满金融大模型的应用创新
XuanYuan/README.md at main Duxiaoman-DI/XuanYuan GitHub...
Android WebView上传文件/自定义弹窗技术,附件的解决方案
安卓内核开发 其实是Android的webview默认是不支持<input type"file"/>文件上传的。现在的前端页面需要处理的是: 权限 文件路径AndroidManifest.xml <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…...
selenium 输入框、按钮,输入点击,获取元素属性等简单例子
元素操作 nput框 输入send_keys, input框 清除clear(), 按钮 点击click() 按钮 提交submit() 获取元素 tag_name、 class属性值、 坐标尺寸 """ input框 输入1次,再追加输入一次, 清除, 再重新输入&…...
结构体构造函数
【知识点:结构体构造函数】下面两段代码等价。 (1)结构体构造函数写法 struct LinkNode {int data;LinkNode* next;LinkNode(int x):data(x),next(NULL) {} }; LinkNode* Lnew LinkNode(123); (2)非结构体构造函数写…...
基于单片机的电子万年历设计
摘要: 本设计以 AT89C51 单片机为主控器,使用 DS1302 时钟芯片、DS18B20 温度芯片、LCD1602 显示模块,利用Proteus 仿真软件和 Keil 编译软件进行了基于单片机的电子万年历仿真,设计的万年历可以在液晶上显示时间,同时还具有时间校准、温度显示等功能。 关键词 :单片机…...
大厂真实面试题(一)
滴滴大数据sql 取出累计值与1000差值最小的记录 1.题目 已知有表t_cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 2.分析 本题主要是想找到累加值域1000差距最小的记录,也就是我们要对上述按照id进行排序并且累加,并…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...


























