Kotlin-类和对象
文章目录
- 类
- 主构造函数
- 次要构造函数
- 总结
- 对象
- 初始化
- 类的继承
- 成员函数
- 属性覆盖(重写)
- 智能转换
- 类的扩展
类
class Student {
}
这是一个类,表示学生,怎么才能给这个类添加一些属性(姓名,年龄…)呢?
主构造函数
我们需要指定类的构造函数。构造函数也是函数的一种,但是它专门用于对象的创建
Kotlin的类可以添加一个主构造函数和一个或多个次要构造函数。主构造函数是类定义的一部分,像下面这样编写:
class Student constructor(name: String, age: Int) {}
如果主构造函数没有任何注释或可见性修饰符,则可以省略constructor
关键字,如果类中没有其他内容要写,也可以直接省略{}
, 像下面这样:
class Student (name: String, age: Int)
但是,这里仅仅是定义了构造函数的参数,还不是类的属性
仅在对象初始化时使用构造函数参数,并且不想让这些参数以属性的形式被外部访问时,可采用这种写法,那我们要怎么才能定义类的属性呢?
可以为这些参数添加var
(可变)或val
(不可变)关键字来表示属性:
class Student (var name: String,val age: Int)
这样才算是定义了类的属性,我们也可以给这些属性设置初始值:
class Student (var name: String = "zhangsan",val age: Int = 20)
因为是构造函数, 实例化的时候会传入值, 所以可以给也可以不给初始值
如果将这些属性直接作为类的成员变量写到类里面,必须配初始值,否则无法通过编译,这样我们不用编写主构造函数也能定义属性,这里仍会隐式生成一个无参的构造函数:
class Student {var name: String = "zhangsan"val age: Int = 20
}
也可以写成这样:
class Student(name : String, age: Int) {var name: String = nameval age: Int = age
}
这样不是多此一举嘛,直接在括号里(主构造函数)定义属性不就好了,这样的好处就是可以自定义属性的get
和set
方法
class Shape(var width:Int, var height:Int) {val area: Int
// get() {
// return width * height
// }get() = width * height
}fun main() {var a = Shape(2, 3)println("Width: ${a.width}, Height: ${a.height}")println("Area: ${a.area}")
}
class Shape(width:Int, height:Int) {val area: Intinit {area = width * height}val perimeter: Intinit {perimeter = (width + height) * 2}
}
当然,如果不希望一开始就有初始值,而是之后某一个时刻(用它之前)去设定初始值, 我们也可以为其添加懒加载(用它之前给属性初始值):
lateinit 修饰符:
- 只能用于可变属性(即 var 声明的属性),而不能用于只读属性(使用 val 声明的属性)
- 不能用于基本数据类型的属性。
class Student {lateinit var name: Stringval age: Int = 0
}
次要构造函数
除了直接使用主构造函数创建对象外,我们也可以添加一些次要构造函数,次要构造函数中的参数仅仅表示传入的参数,不能像主构造函数那样定义属性:
- 如果该类有一个主构造函数,则每个次要构造函数都需要直接或间接委托给主构造函数。委托到同一个类的另一个构造函数是
this
关键字完成的
class Student(var name: String, var age: Int) {//这里的 this 表示当前这个类, this() 就是调用当前类的无参构造函数//这里其实是调用主构造函数,并且参数只有name,年龄直接给默认值18constructor(name: String) : this(name, 18) {println("次要构造函数")}
}fun main() {var stu = Student("小明")
}
- 如果一个类没有主构造函数,那么我们也可以直接在类中编写次要构造函数,:
class Student {var name: Stringvar age: Int//在次要构造函数的参数前使用 var 或者 val 是不被允许的//次要构造函数可以编写自定义的函数体constructor(name: String, age: Int) { //这里的参数不是类属性,仅仅是形参this.name = namethis.age = age}
}
总结
- 主构造函数:可以直接定义类属性,使用更方便,但主构造函数只能存在一个,并且无法编写函数体,不过可以用
init
编写,下面对象初始化有介绍 - 次要(辅助)构造函数:可以存在多个,并且可以自定义函数体,但是无法像主构造函数那样定义类属性,并且当类具有主构造函数时,所有的次要构造函数必须直接或间接地调用主构造函数
对象
构造函数也是函数,我们可以用类名()
的形式创建对象
class Student(var name: String, var age: Int)fun main() {var stu: Student = Student("小明", 18)println(stu.name)println(stu.age)stu.name = "小红"println(stu.name)
}
初始化
在创建对象时,我们可能需要做一些初始化工作,可以使用初始化代码块(使用init
关键字)来完成。假如我们希望对象在创建时, 年龄不足18岁就设定为18岁:
注意:我们在创建对象的时候,就会自动执行init
里面的代码
class Student (var name: String, var age: Int){init {println("我是初始化操作")if (age < 18) age = 18}
}fun main() {var stu = Student("小明", 2)println(stu.age)
}
初始化操作可以有很多个:
class Student (var name: String, var age: Int){//多个初始化操作时,按从上往下的顺序执行init {if (age < 18) age = 18}init {age = 20}
}fun main() {var stu = Student("小明", 2)println(stu.age)
}
如果初始化代码要用成员属性, 那就要在用之前先赋值
class Student {init {println("name is $name")println("age is $age")}var name: String = "Student"var age: Int = 20
}fun main() {var stu = Student()
}
这里需要注意一下,次要构造函数实际上需要先执行主构造函数,所以会优先执行init
class Student (var name: String, var age: Int){init {println("我是初始化代码块")}constructor(name: String) : this(name, 18){println("我是次要构造函数的语句")}
}fun main() {var stu = Student("张三")
}
类的继承
在Kotlin中, 默认情况下, 类是"终态"的(不能被任何类继承)。要使类可继承,要用open
关键字标记需要被继承的类
在Kotlin中只能单继承。需要注意的是,在对象创建并初始化的时候, 会优先对父类进行初始化,再对子类进行初始化
open class Student {init {println("父类初始化")}fun hello() = println("打招呼")
}class ArtStudent: Student() {init {println("子类初始化")}fun draw() = println("我会画画")
}fun main() {val student = ArtStudent()student.draw()student.hello()
}
成员函数
现在我们的类有了属性,而对象也可以做出一些行为,我们可以通过定义函数来实现
class Student(var name: String, var age: Int) {fun hello() {println("大家好, 我是$name")}
}fun main() {val student = Student("路飞", 20)student.hello()
}
如果函数中的变量存在歧义,那么优先使用作用域最近的一个
class Student(var name: String, var age: Int) {fun hello(name: String) {println("大家好, 我是$name")}
}fun main() {Student("路飞", 20).hello("比企谷八幡")
}
如果我们需要获取的是类中的成员属性,需要使用this
关键字来表示
class Student(var name: String, var age: Int) {fun hello(name: String) {println("大家好, 我是${this.name}")}
}fun main() {Student("路飞", 20).hello("比企谷八幡")
}
属性覆盖(重写)
有些时候,我们希望子类继承父类的某些属性,但是又希望去修改这些属性的默认实现
我们可以使用 override
关键字表示对一个属性的覆盖(重写)
open class Student {// 函数必须添加open关键字才能被子类覆盖open fun hello() = println("打招呼")
}class ArtStudent: Student() {// 在子类中重写方法要添加 override 关键字override fun hello() {println("呀哈喽")super.hello()}
}fun main() {val artStudent = ArtStudent()artStudent.hello()
}
同样的, 类的某个变量也是可以进行覆盖的
open class Student {open val name: String = "小明"
}class ArtStudent: Student() {override val name: String = "小红"
}fun main() {val artStudent = ArtStudent()println(artStudent.name)
}
对于可变的变量,也可以这样不加open
open class Student {var name: String = "小明"
}class ArtStudent: Student() {init {name = "小红"}
}fun main() {val artStudent = ArtStudent()println(artStudent.name)
}
也可以在子类的主构造函数中直接覆盖
open class Student {open var name: String = "小明"
}class ArtStudent(override var name: String): Student()fun main() {val artStudent = ArtStudent("小王")println(artStudent.name)
}
open class Student {open var name: String = "小明"
}class ArtStudent(override var name: String): Student() {init {name = "小红"}
}fun main() {val artStudent = ArtStudent("小王")println(artStudent.name)
}
这种初始化顺序要特别注意
open class Student {open var name: String = "小明"init {println(name.length) // 这里拿到的name其实是还未初始化的子类的name}
}class ArtStudent(override var name: String): Student()fun main() {val artStudent = ArtStudent("小王")println(artStudent.name)
}
由于父类初始化在子类之前,此时子类还没有初始化,其覆盖的属性此时没有值,在JVM平台下,没有初始化的对象引用默认为null,那么这里就会出现空指针异常
name明明是一个不可空的String类型,还会出现空指针异常。因此,对于使用了open关键字的属性只要是在初始化函数、构造函数中使用,要额外小心
智能转换
编译器可以根据当前的语境自动进行类型转换
不仅仅是if判断的场景,还包括when、while 以及 && || 等
open class Studentclass ArtStudent: Student() {fun draw(): Boolean = true
}fun main() {val student: Student = ArtStudent()while (student is ArtStudent) student.draw()// 很明显如果前面为真,那么肯定是 ArtStudent 类型, 后面可以智能转换if (student is ArtStudent && student.draw()) ;
}
可空类型同样支持这样的智能转换
class Student {fun hello() = println("Hello World")
}fun main() {val student: Student? = Student()student?.hello()if (student != null) {student.hello() //根据语境将student从Student?智能转换为Student}
}
在处理可空类型时,为了防止出现异常,我们可以使用更加安全的as?
运算符
open class Studentclass ArtStudent: Student()fun main() {val student: Student? = nullstudent as? ArtStudent //当student为null时,不会抛出异常,而是返回null
}
类的扩展
Kotlin提供了扩展类或接口的操作来为其添加额外的函数或属性,无需通过类继承或者使用装饰器等设计模式
比如我们想为String类型添加一个自定义操作
fun String.test() = "hello world"fun main() {val str = ""println(str.test())
}
注意,类的扩展是静态的,实际上并不会修改原本的类,也不会将新成员插入到类中,仅仅是将我们定义的功能变得可调用,像真的有一样。同时,在编译时也会明确具体调用的扩展函数:
open class Shapeclass Rectangle : Shape()fun Shape.getName() = "Shape"
fun Rectangle.getName() = "Rectangle"fun printShape(shape: Shape) {println(shape.getName())
}fun printRectangle(rectangle: Rectangle) {println(rectangle.getName())
}fun main() {printShape(Rectangle())printRectangle(Rectangle())
}
如果类本身就具有同名同参的函数,那么扩展函数将失效:
class Test {fun hello() = println("你干嘛")
}fun Test.hello() = println("哎呦")fun main() {Test().hello()
}
不过,重载是没问题的
class Test {fun hello() = println("你干嘛")
}fun Test.hello(str: String) = println(str)fun main() {Test().hello("哎呦")
}
同样的,类的属性也是可以通过这种形式来扩展的,但是有一些小小的要求
可以看到直接扩展属性是不允许的,扩展并不是真的往类中添加属性。因此, 扩展属性本质上也不会真的插入一个成员字段到类的定义中,这就导致并没有变量去存储我们的数据, 我们只能明确定义get和set来创建扩展属性
class Test val Test.nameget() = "666"fun main() {println(Test().name)
}
由于扩展属性并没有存储真正的变量,而是使用get和set函数,所以,像field这样的后备字段就无法使用了
还有需要注意的是,我们定义的扩展属性,同样受到访问权限控制
除了直接在顶层定义类的扩展外,我们也可以在类中定义其他类的扩展,并且在定义时可以直接使用其他类提供的属性
class A {val name = "张三"
}class B {//像这种扩展,由于是在类中定义,因此也仅限于类内部使用fun A.test() = println(this.name)fun test() = A().test()
}fun main() = B().test()
在函数名发生冲突的时候,需要特别处理
class A {fun hello() = println("Hello A")
}class B {//像这种扩展,由于是在类中定义,因此也仅限于类内部使用fun A.test() {hello() //优先匹配被扩展类里的函数this.hello()this@B.hello()}fun hello() = println("Hello B")fun test() = A().test()
}fun main() = B().test()
定义在类中的扩展也可以跟随类的继承结构,进行重写
open class A {open fun A.test() = "AAA"fun hello() = println(test())
}class B:A() {override fun A.test() = "BBB" //对父类定义的扩展函数进行重写
}fun main() {A().hello()B().hello()
}
我们可以在某个函数里面编写扩展,但作用域仅限于当前函数
fun main() {fun String.print() = println("此剑斩穹,不破不休")"".print()
}
还可以将一个扩展函数作为参数给到一个函数类型变量
fun main() {// func就是扩展函数名val func: String.(Int) -> String = { it.toString() + this }println("出击!".func(123))//如果是直接调用,那就必须传入对应类型的对象作为首个参数,此时this就指向我们传入的参数println(func("撤退!", 321))
}
相关文章:
Kotlin-类和对象
文章目录 类主构造函数次要构造函数总结 对象初始化 类的继承成员函数属性覆盖(重写)智能转换 类的扩展 类 class Student { }这是一个类,表示学生,怎么才能给这个类添加一些属性(姓名,年龄…)呢? 主构造函数 我们需要指定类的构造函数。构造函数也是函数的一种,但是它专门…...
LVS+keepalived实战案例
目录 部署LVS 安装软件 创建VIP 创建保存规则文件 给RS添加规则 验证规则 部署RS端 安装软件 页面内容 添加VIP 配置系统ARP 传输到rs-2 客户端测试 查看规则文件 实现keepalived 编辑配置文件 传输文件给backup 修改backup的配置文件 开启keepalived服务 …...
可视化+智能补全:用Database Tool重塑数据库工作流
一、插件概述 Database Tool是JetBrains系列IDE(IntelliJ IDEA、PyCharm等)内置的数据库管理插件。它提供了从数据库连接到查询优化的全流程支持,让开发者无需离开IDE即可完成数据库相关工作。 核心价值: 统一工作环境…...
【认知思维】沉没成本谬误:为何难以放弃已投入的资源
什么是沉没成本谬误 沉没成本谬误(Sunk Cost Fallacy)是指人们倾向于根据过去已经投入的资源(时间、金钱、精力等)而非未来收益来做决策的一种认知偏差。简单来说,它反映了"我已经投入这么多,不能就这…...
Linux 系统安全基线检查:入侵防范测试标准与漏洞修复方法
Linux 系统安全基线检查:入侵防范测试标准与漏洞修复方法 在 Linux 系统的安全管理中,入侵防范是至关重要的环节。通过对系统进行安全基线检查,可以有效识别潜在的安全漏洞,并采取相应的修复措施,从而降低被入侵的风险…...
【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
题意 需要维护 n n n \times n nn 平面上的整点,每个点 ( x , y ) (x, y) (x,y) 有权值 V ( x , y ) V(x, y) V(x,y),初始都为 0 0 0。 同时给定 n n n 次修改操作,每次修改给出 x 1 , x 2 , y 1 , y 2 , v x_1, x_2, y_1, y_2, v x…...
目标检测任务常用脚本1——将YOLO格式的数据集转换成VOC格式的数据集
在目标检测任务中,不同框架使用的标注格式各不相同。常见的框架中,YOLO 使用 .txt 文件进行标注,而 PASCAL VOC 则使用 .xml 文件。如果你需要将一个 YOLO 格式的数据集转换为 VOC 格式以便适配其他模型,本文提供了一个结构清晰、…...
2025深圳杯D题法医物证多人身份鉴定问题四万字思路
Word版论文思路和千行Python代码下载:https://www.jdmm.cc/file/2712074/ 引言 法医遗传学中的混合生物样本分析,特别是短串联重复序列(Short Tandem Repeat, STR)分型结果的解读,是现代刑事侦查和身份鉴定领域的核心…...
利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析
利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析 漫谈图像去雾化的挑战 在计算机视觉领域,图像复原一直是研究热点。其中,图像去雾化技术尤其具有实际应用价值。然而,复杂的气象条件和多种因素干扰使得这…...
Focal Loss 原理详解及 PyTorch 代码实现
Focal Loss 原理详解及 PyTorch 代码实现 介绍一、Focal Loss 背景二、代码逐行解析1. 类定义与初始化 三、核心参数作用四、使用示例五、应用场景六、总结 介绍 一、Focal Loss 背景 Focal Loss 是为解决类别不平衡问题设计的损失函数,通过引入 gamma 参数降低易…...
VScode 的插件本地更改后怎么生效
首先 vscode 的插件安装地址为 C:\Users\%USERNAME%\.vscode\extensions 找到你的插件包进行更改 想要打印日志,用下面方法 vscode.window.showErrorMessage(console.log "${name}" exists.); 打印结果 找到插件,点击卸载 然后点击重新启动 …...
这类物种组织heatmap有点东西
如果想知道研究对象(人、小鼠、拟南芥、恒河猴等)某个时候各个器官的fMRI信号强度、炎症程度等指标的差异,gganatogram可以以热图的形式轻松满足你的需求。 数据准备 以男性为例,数据包含四列, 每列详细介绍 org…...
通讯录程序
假设通讯录可以存放100个人的信息(人的信息:姓名、年龄、性别、地址、电话) 功能:1>增加联系人 2>删除指定联系人 3>查找指定联系人信息 4>修改指定联系人信息 5>显示所有联系人信息 6>排序(…...
无需翻墙!3D 优质前端模板分享
开发网站时,无需撰写 HTML、CSS 和 JavaScript 代码,直接调用模板内现成的组件,通过拖拽组合、修改参数,几天内即可完成核心页面开发,开发速度提升高达 70% 以上。让开发者更专注于业务逻辑优化与功能创新,…...
Shinkai开源程序 是一个双击安装 AI 管理器(本地和远程),它允许您使用简单的 UI 在 5 分钟或更短的时间内创建 AI 代理
一、软件介绍 文末提供程序和源码下载 Shinkai 开源应用程序在 Web 浏览器中解锁了一流 LLM (AI) 支持的全部功能/自动化。它允许创建多个代理,每个代理都连接到本地或第三方LLMs(例如 OpenAI GPT),这些…...
vscode不能跳转到同一个工作区的其他文件夹
明白了,你说的“第二种情况”是指: 你先打开的是项目文件夹(比如 MyProject),然后通过 VS Code 的“添加文件夹到工作区”功能,把 ThirdPartyLib 文件夹添加进来。 结果,项目代码里 #include “…...
containerd 之使用 ctr 和 runc 进行底层容器操作与管理
containerd 是目前业界标准的容器运行时,它负责容器生命周期的方方面面,如镜像管理、容器执行、存储和网络等。而 ctr 是 containerd 自带的命令行工具,虽然不如 Docker CLI 用户友好,但它提供了直接与 containerd API 交互的能力…...
IMU 技术概述
IMU(惯性测量单元,Inertial Measurement Unit)是一种通过传感器组合测量物体运动状态和姿态的核心设备,广泛应用于导航、控制、智能设备等领域。以下从原理、组成、应用和发展趋势展开说明: 一、核心定义与本质 IMU …...
talk-centos6之间实现
在 CentOS 6.4 上配置和使用 talk 工具,需要注意系统版本较老,很多配置可能不同于现代系统。我会提供 详细步骤 自动化脚本,帮你在两台 CentOS 6.4 机器上实现局域网聊天。 ⸻ 🧱 一、系统准备 假设你有两台主机: …...
hivesql是什么数据库?
HiveSQL并非指一种独立的数据库,而是指基于Apache Hive的SQL查询语言接口,Hive本身是一个构建在Hadoop生态系统之上的数据仓库基础设施。 以下是对HiveSQL及其相关概念的详细解释: 一、Hive概述 定义: Hive是由Facebook开发&…...
(1)python开发经验
文章目录 1 安装包格式说明2 PySide支持Windows7 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 安装包格式说明 PySide下载地址 进入下载地址后有多种安装包,怎么选择: …...
[论文翻译]PPA: Preference Profiling Attack Against Federated Learning
文章目录 摘要一、介绍1、最先进的攻击方式2、PPA3、贡献 二、背景和相关工作1、联邦学习2、成员推理攻击3、属性推理攻击4、GAN攻击5、联邦学习中的隐私推理攻击 三、PPA1、威胁模型与攻击目标(1)威胁模型(2)攻击目标 2、PPA 概述…...
北三短报文数传终端:筑牢水利防汛“智慧防线”,守护江河安澜
3月15日我国正式入汛,较以往偏早17天。据水利部预警显示,今年我国极端暴雨洪涝事件趋多趋频趋强,叠加台风北上影响内陆的可能性,灾害风险偏高,防汛形势严峻复杂。面对加快推进“三道防线”建设,提升“四预”…...
函数加密(Functional Encryption)简介
1. 引言 函数加密(FE)可以被看作是公钥加密(PKE)的一种推广,它允许对第三方的解密能力进行更细粒度的控制。 在公钥加密中,公钥 p k \mathit{pk} pk 用于将某个值 x x x 加密为密文 c t \mathit{ct} c…...
思维链实现 方式解析
思维链的实现方式 思维链的实现方式除了提示词先后顺序外,还有以下几种: 增加详细的中间步骤提示:通过提供问题解决过程中的详细中间步骤提示,引导模型逐步推导和思考。例如,在解决数学证明题时,提示词可以具体到每一步需要运用的定理、公式以及推理的方向,帮助模型构建…...
深入学习Zookeeper的知识体系
目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…...
电商平台一站式安全防护架构设计与落地实践
引言:安全即业务,防御即增长 国际权威机构 Forrester 最新报告指出,2024 年全球电商平台因安全防护不足导致的直接营收损失高达 $180 亿,而采用一体化防护方案的头部企业客户留存率提升 32%。本文基于 10 万 节点防护实战数据&a…...
【Pandas】pandas DataFrame cummin
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...
奇妙小博客
import matplotlib.pyplot as plt# 定义顶点坐标 A [0, 0] B [6, 1] C [4, 6] P [4, 3]# 绘制三角形 ABC plt.plot([A[0], B[0], C[0], A[0]], [A[1], B[1], C[1], A[1]], b-, labelTriangle ABC) # 绘制点 P plt.scatter(P[0], P[1], colorr, labelPoint P(4,3))# 标注顶点…...
嵌入式学习笔记 - HAL_ADC_ConfigChannel函数解析
贴函数原型: 一 首先配置规则通道序列 其实所有的配置函数都是在对寄存器进行操作,要想看懂Hal库底层函数驱动就先把寄存器如何配置看懂,以下是配置规则通道寄存器的介绍,以ADC_SQR3为例,也就是通道序列1到序列6&…...
Java反射详细介绍
的反射(Reflection)是一种强大的机制,允许程序在运行时动态获取类的信息、操作类的成员(属性、方法、构造器),甚至修改类的行为。它是框架开发(如 Spring、MyBatis)、单元测试工具&a…...
2025年土木建筑与水利工程国际会议(ICCHE 2025)
2025 International Conference on Civil and Hydraulic Engineering (ICCHE 2025) (一)会议信息 会议简称:ICCHE 2025 大会地点:中国银川 投稿邮箱:icchesub-paper.com 收录检索:提交Ei Compendex,CPCI,C…...
适应性神经树:当深度学习遇上决策树的“生长法则”
1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在机器学习领域,神经网络(NNs)凭借其强大的表示学习能力&…...
IBM BAW(原BPM升级版)使用教程第十四讲
续前篇! 一、流程设计中的编程 在 IBM Business Automation Workflow (BAW) 中,编程部分涵盖了多种技术、工具和策略,帮助用户定制和扩展流程。BAW 主要通过脚本、集成、服务和自定义代码来实现流程的灵活性和定制化。下面将详细讲解 BAW …...
【计算机网络 第8版】谢希仁编著 第四章网络层 题型总结3 SDN OpenFlow
SDN OpenFlow题型 这题其实,认真看书P196-197的例子也不难理解。我个人认为所谓防自学设计主要就是你没看懂这张图的时候就是天书,你知道怎么读这张图的时候就很简单。不过我相信这个用心一点应该也都是能懂的。 题目 4.66-4.69 4-66 我最大的一个问题…...
【React中函数组件和类组件区别】
在 React 中,函数组件和类组件是两种构建组件的方式,它们在多个方面存在区别,以下详细介绍: 1. 语法和定义 类组件:使用 ES6 的类(class)语法定义,继承自 React.Component。需要通过 this.props 来访问传递给组件的属性(props),并且通常要实现 render 方法返回 JSX…...
多线程代码案例-1 单例模式
单例模式 单例模式是开发中常见的设计模式。 设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守了设计模式,代码的下限就有了一定的保证。设计模式有很多种,在不同的语言中,也有不同的设计…...
langChain存储文档片段,并进行相似性检索
https://python.langchain.ac.cn/docs/how_to/document_loader_pdf/#vector-search-over-pdfs 这段代码展示了如何使用LangChain框架中的InMemoryVectorStore和OpenAIEmbeddings来存储文档片段,并基于提供的查询进行相似性搜索。下面是对每一行代码的详细解释&…...
MQTT协议技术详解:深入理解物联网通信基础
MQTT协议技术详解:深入理解物联网通信基础 1. MQTT协议概述 MQTT (Message Queuing Telemetry Transport) 是一种轻量级的发布/订阅消息传输协议,专为资源受限设备和低带宽、高延迟或不可靠网络环境设计。作为物联网通信的核心协议之一,MQTT…...
python中的进程锁与线程锁
在Python中,线程和进程使用锁的机制有所不同,需分别通过threading和multiprocessing模块实现。以下是具体用法及注意事项: 一、线程锁(Thread Lock) 基本用法 线程锁用于多线程环境下保护共享资源,防止数据…...
导出导入Excel文件(详解-基于EasyExcel)
前言: 近期由于工作的需要,根据需求需要导出导入Excel模板。于是自学了一下下,在此记录并分享!! EasyExcel: 首先我要在这里非常感谢阿里的大佬们!封装这么好用的Excel相关的API,真…...
仿正点原子驱动BMP280气压传感器实例
文章目录 前言 一、寄存器头文件定义 二、设备树文件中添加节点 三、驱动文件编写 四、编写驱动测试文件并编译测试 总结 前言 本文驱动开发仿照正点原子的iic驱动实现,同时附上bmp280的数据手册,可访问下面的链接: BMP280_Bosch(博世…...
Java 反射机制(Reflection)
一、理论说明 1. 反射的定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Jav…...
每日Prompt:发光线条解剖图
提示词 一幅数字插画,描绘了一个 [SUBJECT],其结构由一组发光、干净且纯净的蓝色线条勾勒而成。画面设定在深色背景之上,以突出 [SUBJECT] 的形态与特征。某个特定部位,如 [PART],通过红色光晕加以强调,以…...
从新手到高手:全面解析 AI 时代的「魔法咒语」——Prompt
引言:AI 时代的「语言炼金术」 在人工智能技术突飞猛进的今天,我们正在经历一场堪比工业革命的生产力变革。从聊天机器人到图像生成,从数据分析到自动化写作,AI 模型正在重塑人类与信息交互的方式。而在这一切背后,隐…...
【SpringBoot】集成kafka之生产者、消费者、幂等性处理和消息积压
目录 配置文件 application.properties启动类 ApplicationKafka 配置Message 消息实体类MessageRepository 消息处理消息积压监控服务Kafka消息消费者服务Kafka消息生产者服务API控制器提供测试接口关键特性说明生产环境建议 配置文件 application.properties # 应用配置 serv…...
[SAP] 通过事务码Tcode获取程序名
如何通过事务码查找对应的程序名? 方法一:直接运行事务码,跳转至功能详情页面,点击【系统】|【状态】即可获取对应事务码的程序名 从上面可以了解到自定义的事务码"ZMM01"对应的程序名为"ZYT36_ZMM001_01"&a…...
蓝桥杯12届国B 纯质数
题目描述 如果一个正整数只有 1 和它本身两个约数,则称为一个质数(又称素数)。 前几个质数是:2,3,5,7,11,13,17,19,23,29,31,37,⋅⋅⋅ 。 如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如࿱…...
国产大模型「五强争霸」,决战AGI!
来源 | 新智元 DeepSeek的横空出世,已经彻底改变了全球的AI局势。 从此,不仅中美大模型竞争格局改变,国产大模型的产业版图,也被一举打破! 纵观中国基础大模型的市场,可以看到,如今的基础大模…...
C++修炼:继承
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...