java面向对象编程【高级篇】之特殊类
目录
- 🚀前言
- 🌟final关键字
- 💯常量
- 🦜单例类
- 💯饿汉式单例类
- 💯懒汉式单例类
- ✍️枚举类
- 🐍抽象类
- 💯应用场景
- 💯模版方法设计模式
- ⚙️接口
- 💯实现类
- 💯接口的好处
- 💯新增方法形式
- 💯注意事项
- 💯接口与抽象类的区别
🚀前言
大家好!我是 EnigmaCoder。
本文介绍java面向对象编程中的一些特殊类,如单例类、枚举类、抽象类、接口等。
🌟final关键字
final
在java表示的意思是最终的意思,也可以称为完结器,可以用final
关键字声明类、方法、变量。
final
声明的类为最终类,无法被继承。final
声明的方法无法被重写。final
声明的变量无法被再次赋值。
public class FinalDemo {public static String NAME = "wang"; // final变量private final int AGE = 18;//一般没有意义public static void main(String[] args) {final int a = 10;//a=1; // 错误,final变量不能被修改final int [] b={1,2,3};//final修饰引用类型的变量b[0]=3;}}final class A {}// class B extends A {}// 错误,不能继承final类class C {public final void print(){System.out.println("Hello World");}
}class D extends C {// @Override// public void print(){// System.out.println("Hello World");// }// 错误,不能覆盖final方法}
final修饰变量的注意事项:
final
修饰基础类型的变量,变量存储的数据不能被改变。final
修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变的。
💯常量
使用了static final
修饰的成员变量就被称为常量。
- 作用:常用于记录系统的配置信息。
- 命名规范:要求所有字母大写,多个单词之间用下划线隔开。
public static final int MAX_SCORE=100;
🦜单例类
作用:确保某个类只能创建一个对象。
💯饿汉式单例类
饿汉式单例类是单例模式的一种实现方式,其核心思想是:在类加载时立即创建唯一的实例对象。
实现步骤:
- 第一步:将类的构造器私有,确保单例类对外不能创建太多对象。
- 第二步:定义一个类变量记住类的一个对象。
- 第三步:定义一个类方法,返回对象。
public class A{//定义一个类变量记住类的一个对象private static A a =new A();//类的构造器私有private A(){}//定义一个类方法,返回对象public static A getObject(){return a;}
}
饿汉式单例是单例模式中最基础、最安全的实现方式之一,适合需要 “立即加载实例” 且对内存占用不敏感的场景。其核心优势是通过类加载机制天然保证线程安全,代码简洁可靠,是初学者学习单例模式的入门选择。
💯懒汉式单例类
懒汉式单例类是单例模式的另一种实现方式,其核心思想是:仅在第一次使用单例实例时才创建对象。
实现步骤:
- 第一步:私有构造器
- 第二步:定义一个静态的类变量用于存储对象
- 第三步:提供一个类方法返回类的一个对象
public class B{//定义一个静态的类变量用于存储对象private static B b;//单例必须私有构造器private B(){}//提供一个类方法返回类的一个对象public static B getObject(){if(b==NULL){b=new B();}return b;}
}
- 懒汉式单例的本质是 “用时间换空间”—— 通过延迟实例创建来节省资源,但需通过额外逻辑解决多线程安全问题。其核心思想可概括为:“不急着创建实例,直到真正需要时再创建,同时确保多线程环境下只有一个实例被创建。”
- 实际开发中,推荐使用 静态内部类懒汉式 或 枚举式 实现,兼顾延迟加载与线程安全,代码简洁且高效。
✍️枚举类
枚举类是一种特殊的类。
- 书写格式如下:
修饰符 enum 枚举类名{名称1,名称2 ...其他成员 ...
}
特点:
- 枚举类的第一行,只能写枚举类的对象名称,且要用逗号隔开。
- 这些名称,本质是常量,每个常量都记住了枚举类的一个对象。
- 枚举类都是最终类,不能被继承,枚举类都继承的是
java.lang.Enum
类。 - 枚举类的构造器都是私有的(可以省略不写),因此,枚举类对外不能创建对象。
public enum A{X,Y,Z;
}public class Test{public static void main(String[] args){A a1=A.X;System.out.println(a1);A a2=A.Y;System.out.println(a2);A a3=A.Z;System.out.println(a3);System.out.println("--------------------------------");System.out.println(a1.name());System.out.println(a2.name());System.out.println(a3.name());System.out.println("--------------------------------");System.out.println(a1.ordinal());System.out.println(a2.ordinal());System.out.println(a3.ordinal()); }
}
运行结果:
X
Y
Z
--------------------------------
X
Y
Z
--------------------------------
0
1
2
由于枚举类都继承了
java.lang.Enum
类,所以枚举类可以使用父类的方法,例如,name()
方法获取常量名、ordinal()
方法获取索引。而且从运行结果的第一部分可知,父类重写了Object
类的toString
方法。
🐍抽象类
在java中有一个关键字叫:abstract
,即抽象的意思,可以用它修饰类、成员方法。
abstract
修饰类,这个类就是抽象类。abstract
修饰方法,这个方法就是抽象方法。
格式如下:
修饰符 abstract class 类名{修饰符 abstract 返回值类型 方法名称(形参列表);
}
特点:
- 抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
- 抽象类中不一定要有抽象方法,有抽象方法的类必须是抽象类。
- 抽象类也有成员变量、方法、构造器。
- 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
public abstract class A { public String name;public int age;public A() {System.out.println("A的无参构造器");}public A(String name, int age) {this.name = name;this.age = age;}public abstract void show();public void eat() {System.out.println("A类中的eat方法");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}public class B extends A {@Overridepublic void show() {System.out.println("B show");}}public class Test {public static void main(String[] args) {B b = new B();b.setName("wang");b.setAge(18);b.show();b.eat();System.out.println(b.getName());System.out.println(b.getAge());}
}
运行结果:
A的无参构造器
B show
A类中的eat方法
wang
18
💯应用场景
当父类知道每个子类都要做某个行为,但每个子类要做的事情不一样,父类就定义成抽象方法,交给子类去重写实现,这样去设计抽象类,可以更好的支持多态。
// 定义抽象类 Animal
abstract class Animal {// 抽象方法,用于发出叫声public abstract void makeSound();
}// 定义 Dog 类,继承自 Animal
class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("汪汪汪");}
}// 定义 Cat 类,继承自 Animal
class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("喵喵喵");}
}public class AnimalSoundDemo {public static void main(String[] args) {// 创建 Dog 对象Animal dog = new Dog();// 创建 Cat 对象Animal cat = new Cat();// 调用不同动物的叫声方法dog.makeSound();cat.makeSound();}
}
抽象类
Animal
定义抽象方法makeSound()
,表明父类知晓子类需实现该行为。Dog
和Cat
子类继承后重写方法,输出不同叫声。抽象类提供统一规范,让子类按需实现,利于代码扩展,完美诠释多态,增强程序灵活性与可维护性。
💯模版方法设计模式
模板方法设计模式是一种行为设计模式,它在一个抽象类中定义一个操作的算法骨架,而将一些步骤延迟到子类中实现。这样,子类可以在不改变算法整体结构的情况下,重新定义该算法的某些特定步骤,从而实现代码复用和行为的灵活定制。
// 抽象类,定义写作模板的骨架
abstract class WritingTemplate {// 模板方法,定义写作的整体流程public final void writeArticle() {System.out.println("以下是一篇精彩的文章开始:");introduceTopic();System.out.println("让我们进入正文部分,详细内容如下:");writeContent();System.out.println("接下来,为大家带来文章的总结:");concludeArticle();System.out.println("文章结束,感谢阅读。");}// 抽象方法,引入主题abstract void introduceTopic();// 抽象方法,撰写正文内容abstract void writeContent();// 抽象方法,总结文章abstract void concludeArticle();
}// 新闻稿写作类,继承自 WritingTemplate
class NewsArticleWriter extends WritingTemplate {@Overridevoid introduceTopic() {System.out.println("今日,一则重大消息在社会上引起了广泛关注。");}@Overridevoid writeContent() {System.out.println("据悉,该事件发生在城市的核心区域,影响范围涉及多个领域。相关部门迅速响应,展开了全面的调查和处理工作。");}@Overridevoid concludeArticle() {System.out.println("目前,事件仍在进一步发展中,我们将持续为您跟踪报道。");}
}// 散文写作类,继承自 WritingTemplate
class ProseWriter extends WritingTemplate {@Overridevoid introduceTopic() {System.out.println("在时光的长河中,有一片宁静的角落,那是心灵的港湾。");}@Overridevoid writeContent() {System.out.println("我在这静谧的世界里徘徊,聆听着微风的低语,感受着阳光的轻抚。每一朵花、每一片叶,都诉说着生命的故事。");}@Overridevoid concludeArticle() {System.out.println("这片宁静的角落,将永远珍藏在我的心中,成为我灵魂深处最温暖的回忆。");}
}// 主类,用于测试
public class WritingTemplateDemo {public static void main(String[] args) {// 创建新闻稿写作对象WritingTemplate newsWriter = new NewsArticleWriter();// 撰写新闻稿newsWriter.writeArticle();System.out.println();// 创建散文写作对象WritingTemplate proseWriter = new ProseWriter();// 撰写散文proseWriter.writeArticle();}
}
以下是一篇精彩的文章开始:
今日,一则重大消息在社会上引起了广泛关注。
让我们进入正文部分,详细内容如下:
据悉,该事件发生在城市的核心区域,影响范围涉及多个领域。相关部门迅速响应,展开了全面的调查和处理工作。
接下来,为大家带来文章的总结:
目前,事件仍在进一步发展中,我们将持续为您跟踪报道。
文章结束,感谢阅读。以下是一篇精彩的文章开始:
在时光的长河中,有一片宁静的角落,那是心灵的港湾。
让我们进入正文部分,详细内容如下:
我在这静谧的世界里徘徊,聆听着微风的低语,感受着阳光的轻抚。每一朵花、每一片叶,都诉说着生命的故事。
接下来,为大家带来文章的总结:
这片宁静的角落,将永远珍藏在我的心中,成为我灵魂深处最温暖的回忆。
文章结束,感谢阅读。
- 抽象类
WritingTemplate
定义了writeArticle
模板方法,包含通用写作流程文本,将引入主题、撰写正文、总结文章设为抽象方法。NewsArticleWriter
和ProseWriter
子类继承该抽象类,各自实现抽象方法,输出新闻稿与散文对应内容。主类创建子类对象并调用writeArticle
方法,展示不同类型文章写作。此设计实现代码复用,增强扩展性,利于维护和扩展新文章类型。
⚙️接口
java
提供了一个关键字interface
定义出接口。
格式如下:
public interface 接口名{//成员变量(常量)//成员方法(抽象方法)
}
案例:
public interface A {//1. 常量:接口中的常量,默认是public static finalint NUM= 1;//2. 抽象方法:接口中的方法,默认是public abstractvoid run();
}
注意:接口同样不能创建对象。
💯实现类
接口是用来被类实现(implements
)的,实现接口的类称为实现类,一个类可以同时实现多个接口。
格式如下:
修饰符 class 实现类类名 implements 接口1,接口2,接口3 ...{//实现类实现多个接口,必须重写完全部抽象方法,否则实现类需要定义成抽象类。
}
public class C implements A, B {@Overridepublic void run() {}@Overridepublic void eat() {}
}
💯接口的好处
- 弥补了类单继承的不足,一个类同时可以实现多个接口,使类的角色更多,功能更强大。
// 定义绘画接口
interface Paintable {void paint();
}// 定义歌唱接口
interface Singable {void sing();
}// 定义教学接口
interface Teachable {void teach();
}// 定义一个人,他可以绘画、唱歌和教学
class Person implements Paintable, Singable, Teachable {@Overridepublic void paint() {System.out.println("这个人正在绘画,画出了美丽的风景。");}@Overridepublic void sing() {System.out.println("这个人正在唱歌,歌声很动听。");}@Overridepublic void teach() {System.out.println("这个人正在教学,传授知识。");}
}public class InterfaceBenefitDemo {public static void main(String[] args) {Person person = new Person();person.paint();person.sing();person.teach();}
}
Person
类同时实现了这三个接口,意味着一个人可以同时具备绘画、唱歌和教学的能力。在Java
里,类只能有一个直接父类,但通过实现多个接口,就能让类拥有更多角色和功能,弥补了单继承的不足。
- 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现(更有利于程序的解耦合)
// 定义消息发送接口
interface MessageSender {void sendMessage(String message);
}// 邮件消息发送实现类
class EmailSender implements MessageSender {@Overridepublic void sendMessage(String message) {System.out.println("通过邮件发送消息: " + message);}
}// 短信消息发送实现类
class SMSSender implements MessageSender {@Overridepublic void sendMessage(String message) {System.out.println("通过短信发送消息: " + message);}
}// 消息服务类,依赖于消息发送接口
class MessageService {private MessageSender sender;public MessageService(MessageSender sender) {this.sender = sender;}public void processMessage(String message) {sender.sendMessage(message);}
}public class MessageSendingSystem {public static void main(String[] args) {// 使用邮件发送消息MessageSender emailSender = new EmailSender();MessageService emailService = new MessageService(emailSender);emailService.processMessage("这是一封重要邮件通知。");// 切换到短信发送消息MessageSender smsSender = new SMSSender();MessageService smsService = new MessageService(smsSender);smsService.processMessage("这是一条紧急短信提醒。");}
}
在
main
方法中,我们可以轻松地切换不同的消息发送方式,只需要创建不同的消息发送实现类对象,并将其传递给MessageService
类即可。这体现了面向接口编程的灵活性,同时也实现了程序的解耦合。如果需要添加新的消息发送方式,只需要创建一个新的类实现MessageSender
接口,而不需要修改MessageService
类的代码。
💯新增方法形式
从JDK8
开始,接口新增了三种形式的方法:
public interface A{//1.默认方法(实例方法):使用default修饰,默认会加上public修饰。//注意:只能使用接口的实现类对象调用。default void test1(){}//2.私有方法:必须用private修饰(JDK9开始才支持)private void test2(){}//3.类方法(静态方法):使用static修饰,默认会被加上public修饰//注意:只能用接口名调用static void test3(){}
}
💯注意事项
- 接口与接口可以多继承:一个接口可以同时继承多个接口。
- 类与类:单继承 一个类只能继承一个直接父类。
- 类与接口:多实现 一个类可以同时实现多个接口。
- 接口与接口:多继承 一个接口可以同时继承多个接口。
interface A{
}
interface B{
}
interface C extends A,B{
}
- 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承也不支持多实现。
interface A{void show();
}
interface B{
String show();
}
interface C extends A,B{
}
class D implements A,B{
}
此时会报错。将
String
改为void
后,就不会报错。
- 一个类继承的父类又同时实现了接口,如果父类中和接口中有相同的方法,实现类会优先用父类的。
interface A{void show();
}
interface B{void show();
}
class C extends A implements B{
}
此时实现类会使用父类中的
show
方法。
- 一个类实现了多个接口,如果多个接口中存在同名的方法,可以不冲突,这个类重写该方法即可。
interface A{void show();
}
interface B{void show();
}
class C implements A,B{@Overridepublic void show(){A.super.show();B.super.show();}
💯接口与抽象类的区别
对比维度 | 抽象类 | 接口 |
---|---|---|
实例化能力 | 不能直接实例化,需由具体子类继承并实现抽象方法后,才可创建子类对象。 | 不能直接实例化,需由类实现接口的所有抽象方法后,创建该类的对象。 |
成员变量 | 可以有普通成员变量,成员变量的访问修饰符可以是 private 、protected 、public 等。 | 只能有常量,成员变量默认且必须是 public static final 修饰。 |
构造方法 | 可以有构造方法,用于初始化抽象类的成员变量,子类实例化时会调用抽象类的构造方法。 | 没有构造方法,因为接口不存在需要初始化的成员变量。 |
方法类型 | 可以包含普通方法、抽象方法。普通方法有具体的实现逻辑,抽象方法只有方法声明。 | Java 8 之前只有抽象方法;Java 8 引入默认方法和静态方法,Java 9 引入私有方法。默认方法有默认实现,静态方法属于接口本身。 |
继承/实现规则 | 一个类只能继承一个抽象类,遵循单继承原则。 | 一个类可以实现多个接口,实现了多继承的功能。 |
关系体现 | 体现“is - a”关系,即子类是抽象类的一种具体类型,强调类的从属关系。 | 体现“can - do”关系,即类具备接口所定义的能力,强调功能的实现。 |
访问修饰符 | 抽象方法的访问修饰符可以是 protected 、public ;普通方法可以是各种合法的访问修饰符。 | 接口中的方法默认是 public abstract ,不允许使用其他访问修饰符;常量默认是 public static final 。 |
设计目的 | 用于对一组具有相似特征和行为的类进行抽象,提取共性,方便代码复用和扩展。 | 用于定义一组行为规范,使得不同的类可以实现相同的行为,提高代码的可扩展性和可维护性。 |
代码维护复杂度 | 当抽象类需要修改时,可能会影响到所有继承它的子类,维护复杂度相对较高。 | 接口修改时,如果只添加默认方法或静态方法,不会影响实现类;但如果修改抽象方法,会影响所有实现类。 |
使用频率场景 | 适用于具有共同属性和行为,且部分行为实现逻辑相同的一组类。 | 适用于不同类之间需要实现相同的功能,但这些类在本质上没有继承关系的场景。 |
相关文章:
java面向对象编程【高级篇】之特殊类
目录 🚀前言🌟final关键字💯常量 🦜单例类💯饿汉式单例类💯懒汉式单例类 ✍️枚举类🐍抽象类💯应用场景💯模版方法设计模式 ⚙️接口💯实现类💯接…...
JVM 一文详解
目录 JVM 简介 JVM 中的内存区域划分 1. 堆(一个进程只有一份 ------ 线程共享) 2. 栈(一个进程可以有 N 份 ------ 线程私有) Java 虚拟机栈: 本机方法栈: 3. 程序计数器(一个线程可以…...
PVD中断检测掉电
文章目录 概述配置掉电擦写注意 概述 STM32 PVD功能具体可以检测到上电、掉电瞬间,其处理方式有中断响应及事件响应。掉电设置为上升沿触发,上电为下降沿触发 配置 1.开启PVD中断并设置其优先级 2.配置响应中断或事件的阈值电压 3.配置响应模式 生成…...
Nginx — 防盗链配置
防盗链简述 防盗链是一种保护网络资源所有者权益的技术手段,旨在防止未经授权的用户或网站通过直接链接的方式盗用资源,以下是关于防盗链的简述: 原理 基于请求头验证:服务器通过检查请求头中的特定字段,如Referer字…...
题解:P2485 [SDOI2011] 计算器
### 思路 本题是一个比较模板化的题目。 #### 一操作 考虑使用快速幂。 快速幂,只需要把 $k$ 变成二进制即可实现 $\Theta(\log k)$ 的时间复杂度。 实现方法: cpp long long qmi(long long a,long long k,long long p){ long long res 1; …...
【算法刷题笔记day one】滑动窗口(定长基础版)
前言 hello大家好呀 好久不见,上次更新是去年12月份的事情了。这段时间好好沉淀了一下,打了几场比赛,论文也写了一些,也收集了不少信息,对未来方向也有了不一样的计划。 这个算法系列可以说是接着我之前的数据结构系…...
Redis从入门到实战实战篇2
面试重点:本篇包含悲观锁,乐观锁,多线程以及分布式锁的知识 目录 3.优惠卷秒杀 3.1 -全局唯一ID 3.2 -Redis实现全局唯一Id 3.3 添加优惠卷 3.4 实现秒杀下单 3.5 库存超卖问题分析 3.6 乐观锁解决超卖问题 3.7 优惠券秒杀-一人一单 …...
代码随想录算法训练营Day43
力扣300.最长递增子序列 力扣674.最长连续递增子序列【easy】 力扣1143.最长公共子序列【medium】 力扣718.最长重复子数组【medium】 一、力扣300.最长递增子序列【medium】 题目链接:力扣300.最长递增子序列 视频链接:代码随想录 题解链接:…...
Scrapy框架之【settings.py文件】详解
settings.py 文件的主要作用是对 Scrapy 项目的全局设置进行集中管理。借助修改这个文件中的配置项,你可以对爬虫的行为、性能、数据处理等方面进行灵活调整,而无需修改爬虫代码。 ①默认英文注释settings.py # Scrapy settings for douban project # …...
Nginx发布Vue(ElementPlus),与.NETCore对接(腾讯云)
案例资料链接:https://download.csdn.net/download/ly1h1/90745660 1.逻辑说明 1.1 逻辑示意图 # 前端请求处理逻辑图浏览器请求流程: 1. 浏览器发起请求├─ 开发环境(DEV)│ ├─ 请求URL: http://192.168.0.102:3000/api/xxx│ └─ 被Vite代理处理└─ 生产…...
深入探索 AAC 编码原理与 ADTS 格式:音频世界的智慧结晶
在数字音频的广阔领域中,AAC 编码及其相关的 ADTS 格式扮演着至关重要的角色。无论是在我们日常使用的音乐 APP,还是高清视频中的音频部分,都能看到它们的身影。今天,就让我们深入探索 AAC 编码原理与 ADTS 格式的奥秘,…...
深度学习核心架构:探明四种基础神经网络
摘要 本文对多层感知机(MLP)、卷积神经网络(CNN)、循环神经网络(RNN)和注意力机制等深度学习核心架构的内部运作机制进行可视化分析。通过展示参数学习过程、激活映射和注意力分布等关键特征,揭示了"黑箱"模型的内部工作原理,为模型可解释性研…...
解析机器人 2.0.2 | 支持超过50种短视频平台的链接解析,无水印提取,多功能下载工具
解析机器人是一款功能强大的工具软件,登录即可解锁会员特权。它支持超过50种短视频平台的链接解析,包括抖音、快手、西瓜、bilibili等,并能实现无水印提取。此外,还提供P2P下载、磁力链等多种下载方式,确保用户能够快速…...
【漫话机器学习系列】237. TSS总平方和
深度理解 TSS(总平方和):公式、意义与应用 在机器学习与统计建模领域,评价模型好坏的重要指标之一就是方差与误差分析。其中,TSS(Total Sum of Squares,总平方和)扮演着非常关键的角…...
flutter3.29 build.gradle.kts设置安卓签名
1、在android目录下创建key.properties文件 storePassword密码 keyPassword密码 keyAlias别名 storeFilejks文件完整路径 2、修改android/app/build.gradle.kts 顶部插入import java.util.Properties import java.io.FileInputStreamval keystoreProperties Properties() v…...
<servlet-class>和</url-pattern>的作用
在 SpringMVC 的 web.xml 配置中,<servlet-class> 和 <url-pattern> 是两个关键配置项,分别用于指定处理请求的 Servlet 类和定义该 Servlet 拦截的请求路径规则。以下是它们的具体作用及原理分析: 一、<servlet-class> 的…...
linux部署的mysql数据库修改表名为小写配置
背景: 使用ruoyi-flowable框架初始化流程表结构时, 执行的sql语句创建的表名是大写。但mysql执行sql时大小写是敏感的 删除大写表 处理配置 使用mysql 8.0.41配置表名大小写敏感配置,需要初始化数据库 在MySQL 8.0及以上版本中,lower_case_table_names参…...
【Hot 100】94. 二叉树的中序遍历
目录 引言二叉树的中序遍历我的解题代码优化更清晰的表述建议: 🙋♂️ 作者:海码007📜 专栏:算法专栏💥 标题:【Hot 100】94. 二叉树的中序遍历❣️ 寄语:书到用时方恨少ÿ…...
基于D-Mixer与TransXNet的YOLOv8改进—融合全局-局部特征与空间降维注意力机制的CNN-ViT混合架构
随着目标检测任务对精度与效率要求的不断提升,传统的卷积神经网络(CNN)在建模长程依赖和复杂语义关系方面逐渐暴露出其局限性。而视觉Transformer(ViT)虽然在全局信息建模上表现优异,却因计算开销大、局部细节感知能力不足,在实时检测任务中难以直接部署。本文提出一种面向Y…...
《算法导论(第4版)》阅读笔记:p2-p3
《算法导论(第4版)》学习第 2 天,p2-p3 总结,总计 2 页。 一、技术总结 无。 二、英语总结(生词:1) 1.incremental (1) increase: in-(“in”) crescere “to grow” (2)increment (3)incremental: increment -al adj. incremental…...
基于Qlearning强化学习的电梯群控系统高效调度策略matlab仿真
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 Q-learning强化学习原理 2.2 基于Q-learning的电梯群控系统建模 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作…...
嵌入式硬件篇---STM32F103C8T6STM32F103RCT6
文章目录 前言一、相同点内核与主频基础外设开发环境 二、不同点1. 存储容量2. 外设资源3. 封装与引脚 三、代码移植注意事项1. 内存与 Flash 限制Flash差异RAM调整 2. 外设差异外设缺失:GPIO 映射: 3. 中断向量表中断向量偏移 4. 时钟与总线配置APB分频…...
rhce第二次作业
任务目标 1.配置ssh实现A,B主机互相免密登录 2.配置nginx服务,通过多ip区分多网站 任务一 关闭防火墙 [rootlocalhost ~]# setenforce 0 [rootlocalhost ~]# systemctl stop firewalld.service A主机免密登录B主机 ### A主机生成密钥 [rootlocalh…...
Linux第20节 --- inode和文件系统
一、没有被打开的文件 如果一个文件没有被打开,那么该文件存储在哪里? 该文件是存储在磁盘当中的! 文件 文件内容 文件属性! 文件的内容是按照数据块存储的;文件的属性其实就是inode(是一个128字节的…...
LeetCode - 19.删除链表的倒数第N个结点
目录 题目 解法一 双指针算法 核心思想 执行流程 具体例子 代码 解法二 两次遍历法 核心思想 执行流程 具体例子 代码 题目 19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 解法一 双指针算法 核心思想 利用双指针间隔固定距离(n1)&a…...
在 Ubuntu 上安装 cPanel
开始之前,请确保拥有一台 Ubuntu 服务器,推荐使用 Ubuntu 22.04 LTS。如果没有,可以查看免费服务器: 11个免费 VPS,够用一辈子了!(2025最新)Top 11 免费VPS推荐平台对比(…...
《Linux macOS :GCC升级方法》
GCC(GNU Compiler Collection)是广泛使用的编译器套件,升级到9以上版本可以获得更好的C17/20支持和性能优化。以下是不同Linux发行版和macOS的升级方法: Ubuntu/Debian 系统 添加工具链源 sudo apt update sudo apt install soft…...
C++ STL vector容器详解:从原理到实践
引言 亲爱的小伙伴们,今天我要和大家分享一个C编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性&#…...
[计算机网络]数据链路层
0 概论:数据链路层都干什么事,提供啥功能 比物理层再高一层就是数据链路层,咱们上一篇讲物理层,物理层直接接触传输介质,现在数据链路层是使用物理层的传输服务,然后实现更多的功能。物理层是只管把比特流…...
基于 vue-flow 实现可视化流程图
vue-flow 是一个基于 Vue.js 的强大且灵活的可视化流程图库,它允许开发者轻松创建交互式的流程图、工作流图、节点图等。 主要特点 易于使用 :提供了简洁的 API 和组件,开发者可以快速上手并创建复杂的流程图。高度可定制 :支持…...
【网络编程】HTTP(超文本传输协议)详解
🦄个人主页:修修修也 🎏所属专栏:网络编程 ⚙️操作环境:Visual Studio 2022 目录 📌HTTP定义 📌HTTP工作原理 1.客户端发起请求: 2.服务器处理请求: 3.客户端处理响应: 📌HTTP关键特性 🎏HTTP请求方法 &am…...
NuttX 与 PX4 系统开发全流程详解
NuttX 与 PX4 系统开发全流程详解 目录 1. NuttX 构建与使用2. NuttX 启动流程解析3. BootLoader 源码分析4. GPIO 驱动机制5. I2C 驱动分析6. PX4 系统架构简析7. uORB 消息机制8. PX4 应用开发示例9. 串口及 GPS 驱动解析10. MAVLink 协议与 PX4 交互 1. NuttX 构建与使用 …...
【Mytais系列】Myatis的设计模式
目录 设计模式 1. 工厂模式(Factory Pattern) 2. 建造者模式(Builder Pattern) 3. 动态代理模式(Dynamic Proxy Pattern) 4. 模板方法模式(Template Method Pattern) 5. 策略模…...
Linux:进程优先级及环境
一:孤儿进程 在Linux系统中,当一个进程创建了子进程后,如果父进程执行完毕或者提前退出而子进程还在运行,那么子进程就会成为孤儿进程。子进程就会被systemd(系统)进程收养,其pid为1 myproces…...
网络编程初识
注:此博文为本人学习过程中的笔记 1.socket api 这是操作系统提供的一组api,由传输层向应用层提供。 2.传输层的两个核心协议 传输层的两个核心协议分别是TCP协议和UDP协议,它们的差别非常大,编写代码的风格也不同,…...
疾病传播模拟 ——python实操
1、需求 疾病传播模拟 定义一个Infection类,包含初始感染人数、每日感染率等属性,以及一个simulate_spread方法用于模拟疾病传播过程。 使用numpy随机生成初始感染人数(范围1-100)和每日感染率(范围0.01-0.1)。 创建Infection对象,模拟10天的疾病传播过程,每天计算感染…...
用docker ffmpeg测试视频vmaf分数,很快不用编译
之前测试vmaf要自己编译libvmaf,自己编译ffmpeg,巨麻烦,或者用老旧不再维护的docker仓库,最近在docker hub上发现了编译了libvmaf的ffmpeg的docker,而且镜像很小,适合直接运行。 # dest.mp4 评分视频&…...
【浅学】Windows下ffmpeg+nginx+flv将本地视频推流在本地搭建的Web前端页面中播放,超详细步骤
Nginx安装和配置 下载nginx-1.19.3-http-flv 模块预编译包并解压放在d盘,路径就跟安装步骤里说的一样(如下图),不然会有其他问题出现。 打开conf/nginx.conf,查看RTMP和http相关的配置,确认端口号和路由名称 ffpemg推流视频…...
SQL笔记——左连接、右连接、内连接
前言:总是忘记表连接的区别,在面试的时候也容易被问到,因此就好记性不如烂笔头吧 集合运算 有并集、交集、差集 联合查询*(针对行合并的)* union为关键字,就是将两个select的结果求并集(此时重…...
iOS启动优化:从原理到实践
前言 在iOS应用开发中,启动速度是影响用户体验的重要因素之一。研究表明,启动时间每增加1秒,用户留存率就会下降约7%。本文将深入探讨iOS启动优化的各个方面,从底层原理到具体实践,帮助开发者打造更快的应用启动体验。…...
202553-sql
目录 一、196. 删除重复的电子邮箱 - 力扣(LeetCode) 二、602. 好友申请 II :谁有最多的好友 - 力扣(LeetCode) 三、176. 第二高的薪水 - 力扣(LeetCode) 一、196. 删除重复的电子邮箱 - 力扣…...
Socket-TCP
在TCP/ip协议中,用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个通信! 端口号范围划分 0 - 1023: 知名端口号,HTTP,FTP,SSH 等这些广为使用的应用层协议,他们的端口号都是固定的。…...
BOSS的收入 - 华为OD机试(A卷,C++题解)
华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 代码不懂有疑问欢迎留言或私我们的VX:code5bug。 题目描述 一个 XX 产品行销总公司,只有一个 boss,其有若干一级分销&…...
神经网络的基本概念与深度解析——基于生物机制的仿生建模与工程实现
广义上讲,神经网络是泛指生物神经网络与人工神经网络这两个方面。所谓生物神经网络是指由中枢神经系统(脑和脊髓)及周围神经系统(感觉神经、运动神经、交感神经、副交感神经等)所构成的错综复杂的神经网络,…...
JavaScript基础-运算符优先级
在JavaScript编程中,理解运算符的优先级是编写正确且高效代码的关键之一。当一个表达式包含多个运算符时,JavaScript会根据运算符的优先级来决定执行顺序。如果不了解这些规则,可能会导致意外的结果。本文将详细介绍JavaScript中的运算符优先…...
【RocketMQ NameServer】- NameServer 启动源码
文章目录 1. 前言2. RocketMQ 通信架构3. NameServer 启动流程3.1 创建 NameServerController3.2 启动 NameServerController3.3 NamesrvController#initialize3.3.1 Netty 通信的整体流程3.3.2 创建 NettyRemotingServer 3.4 this.remotingServer.start()3.4.1 this.remotingS…...
Learning vtkjs之WindowedSincPolyDataFilter
过滤器 模型简化(光滑处理) 介绍 像是对模型进行特征信息的简化(光滑处理) 效果 核心代码 主要流程 const fullScreenRenderer vtkFullScreenRenderWindow.newInstance({background: [0, 0, 0],rootContainer: vtkContainerR…...
C++ - 数据容器之 forward_list(创建与初始化、元素访问、容量判断、元素遍历、添加元素、删除元素)
一、创建与初始化 引入 <forward_list> 并使用 std 命名空间 #include <forward_list>using namespace std;创建一个空 forward_list forward_list<int> fl;创建一个包含 5 个元素,每个元素初始化为 0 的 forward_list forward_list<int&g…...
ES6/ES11知识点
ES 全称ECMAScript ,是脚本语言的规范,javascript是ES的一种实现。 作用域链 在 JavaScript 中,作用域链是一个非常重要的概念,它决定了变量和函数的访问顺序。掌握作用域链有助于深入理解执行上下文、闭包和变量查找等概念。 …...
力扣面试150题--二叉树的最大深度
Day 40 题目描述 做法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right…...