Java中的内部类详解
目录
什么是内部类?
生活中的内部类例子
为什么需要内部类?
生活中的例子
内部类的存在意义
内部类的分类
1. 成员内部类
什么是成员内部类?
成员内部类的特点
如何使用成员内部类?
成员内部类访问外部类同名成员
2. 静态内部类
什么是静态内部类?
静态内部类的特点
静态内部类的使用
静态内部类的方法调用
3. 局部内部类
什么是局部内部类?
局部内部类的特点
局部内部类的使用
4. 匿名内部类
什么是匿名内部类?
匿名内部类的特点
匿名内部类的格式
匿名内部类的使用场景
匿名内部类示例
内部类的实际应用
1. 实现多重继承
2. 封装实现细节
3. 回调机制
内部类与Lambda表达式
内部类编译后的文件命名规则
内部类面试常见问题
1. 内部类的各种差异比较
2. 为什么局部内部类只能访问final局部变量?
内部类与外部类的关系
内部类与外部类的关联
总结
什么是内部类?
内部类就是定义在另一个类内部的类。写在成员位置的,属于外部类的成员。
想象一下我们的日常生活:一台电脑包含CPU、内存、硬盘等组件。从面向对象的角度看,我们可以将电脑看作一个类(Computer
),而CPU、内存等组件则可以看作电脑内部的类(CPU
, Memory
, HardDisk
)。这些组件属于电脑,在电脑内部工作,与电脑有紧密的联系。
这就像Java中的内部类概念:一个类定义在另一个类的内部,形成一种"类中有类"的结构。
生活中的内部类例子
// 电脑类
public class Computer {private String brand;private double price;// CPU内部类class CPU {private String model;private int cores;public void run() {// CPU可以访问电脑的品牌信息System.out.println(brand + "电脑的" + model + "处理器正在运行...");}}// 显卡内部类class GraphicsCard {private String model;private int memory;public void display() {// 显卡也可以访问电脑的信息System.out.println(brand + "电脑的" + model + "显卡正在渲染画面...");}}// 电脑使用内部组件public void start() {CPU cpu = new CPU();cpu.model = "Intel i7";cpu.run();GraphicsCard gc = new GraphicsCard();gc.model = "NVIDIA RTX 3080";gc.display();}
}
在这个例子中:
Computer
是外部类,代表整台电脑CPU
和GraphicsCard
是内部类,代表电脑的组件- 内部类可以访问外部类的属性(
brand
) - 外部类可以直接创建和使用内部类
这种设计反映了现实世界中的"整体-部分"关系,内部类就像是外部类的一个组成部分。
public class Outer { // 外部类private int num = 10;class Inner { // 内部类// 内部类的代码}
}
为什么需要内部类?
理解内部类存在的原因,可以通过更多的生活例子来理解:
生活中的例子
-
汽车与发动机
- 汽车(Car)是外部类,发动机(Engine)是内部类
- 发动机是汽车的核心组件,与汽车紧密相关
- 发动机需要访问汽车的各种状态(油量、温度等)
- 一般不会将发动机单独使用,它主要为汽车服务
-
手机与应用程序
- 手机(Phone)是外部类,应用程序(App)是内部类
- 应用程序需要访问手机的功能(摄像头、存储空间等)
- 应用程序主要为手机提供特定功能
内部类的存在意义
-
提高封装性
- 内部类可以访问外部类的所有成员,包括私有成员
- 内部类本身可以对外隐藏,只有外部类能访问它
- 实现高内聚、低耦合的设计理念
-
实现多重继承
- Java不支持类的多重继承,但内部类可以继承其他类
- 通过在一个类中创建多个内部类,每个内部类继承不同的类,实现类似多重继承的效果
-
更好地实现回调机制
- 匿名内部类特别适合用于事件处理和回调机制
- 简化了接口实现的代码结构
-
隐藏实现细节
- 将实现细节隐藏在外部类内部,对外只暴露必要的接口
- 如集合框架中的迭代器实现,就是通过内部类完成的
-
组织逻辑上紧密相关的类
- 当一个类只对另一个类有用时,将其定义为内部类可以更好地组织代码
- 体现了"has-a"关系中的"a"是专属于宿主对象的情况
内部类的分类
Java中的内部类主要分为四种类型:
- 成员内部类:写在类成员位置的内部类
- 静态内部类:使用static修饰的内部类
- 局部内部类:定义在方法中的内部类
- 匿名内部类:没有名字的内部类,隐藏了类的名字
1. 成员内部类
什么是成员内部类?
成员内部类是定义在类成员位置的内部类,就像一个普通的成员变量一样。
成员内部类的特点
- 可以使用外部类的所有成员和方法,即使是private的
- 在JDK 16之前,成员内部类中不能定义静态成员
- 成员内部类可以被访问修饰符修饰:
private
、default
、protected
、public
- 成员内部类不能脱离外部类对象独立存在,需要先创建外部类对象
如何使用成员内部类?
方式一:在外部类中直接创建内部类对象并使用
public class Outer {private int num = 10;// 成员内部类class Inner {public void show() {System.out.println("外部类成员变量num=" + num);}}// 在外部类中使用内部类public void method() {Inner i = new Inner();i.show();}
}
方式二:在其他类中使用成员内部类
public class Test {public static void main(String[] args) {// 先创建外部类对象Outer outer = new Outer();// 再创建内部类对象Outer.Inner inner = outer.new Inner();// 使用内部类方法inner.show();}
}
成员内部类访问外部类同名成员
如果内部类和外部类有同名的成员变量,可以使用外部类名.this.成员变量
来访问外部类的成员:
public class Outer {private int num = 10;class Inner {private int num = 20;public void show() {int num = 30;System.out.println("局部变量:" + num); // 30System.out.println("内部类成员变量:" + this.num); // 20System.out.println("外部类成员变量:" + Outer.this.num); // 10}}
}
2. 静态内部类
什么是静态内部类?
静态内部类是使用static
关键字修饰的内部类,是一种特殊的成员内部类。
静态内部类的特点
- 静态内部类只能访问外部类的静态成员,不能直接访问非静态成员
- 静态内部类可以包含静态成员,也可以包含非静态成员
- 创建静态内部类对象时,不需要依赖外部类对象
静态内部类的使用
创建静态内部类对象的格式:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
示例代码:
public class Car { // 外部类private String carName;private static int carAge = 10;// 静态内部类static class Engine {private String engineName;public void show() {// 可以访问外部类静态成员System.out.println("汽车年龄:" + carAge);// 不能访问外部类非静态成员// System.out.println(carName); // 编译错误}}
}// 使用静态内部类
public class Test {public static void main(String[] args) {// 直接创建静态内部类对象,不需要外部类对象Car.Engine engine = new Car.Engine();engine.show();}
}
静态内部类的方法调用
- 调用静态内部类的静态方法:
外部类名.内部类名.方法名();
- 调用静态内部类的非静态方法:先创建静态内部类对象,再用对象调用方法
public class Outer {// 静态内部类static class Inner {// 静态方法public static void staticMethod() {System.out.println("静态内部类的静态方法");}// 非静态方法public void normalMethod() {System.out.println("静态内部类的非静态方法");}}
}// 调用方法
public class Test {public static void main(String[] args) {// 调用静态方法Outer.Inner.staticMethod();// 调用非静态方法Outer.Inner inner = new Outer.Inner();inner.normalMethod();}
}
3. 局部内部类
什么是局部内部类?
局部内部类是定义在方法中的类,像局部变量一样,只能在定义它的方法内部使用。
局部内部类的特点
- 只能在定义它的方法内部使用
- 可以访问外部类的所有成员
- 可以访问方法中的final或effectively final(Java 8以后)的局部变量
局部内部类的使用
public class Outer {private int outerField = 10;public void method() {final int localVar = 20; // final局部变量int effectivelyFinal = 30; // effectively final变量(不会被修改)// 局部内部类class LocalInner {public void show() {// 访问外部类成员System.out.println("外部类成员:" + outerField);// 访问方法中的局部final变量System.out.println("局部变量:" + localVar);// 访问effectively final变量System.out.println("Effectively final变量:" + effectivelyFinal);}}// 创建局部内部类对象并调用方法LocalInner inner = new LocalInner();inner.show();// 注意:这里不能修改effectivelyFinal的值// effectivelyFinal = 40; // 这样会导致编译错误}
}
4. 匿名内部类
什么是匿名内部类?
匿名内部类是隐藏了名字的内部类,本质上是一个没有名字的局部内部类,它必须继承一个类或实现一个接口。
匿名内部类的特点
- 没有显式的类名
- 在声明的同时完成实例化
- 一般用于实现接口或继承类
- 编译后会生成
外部类名$数字.class
文件
匿名内部类的格式
new 类名或接口名() {// 重写方法
};
匿名内部类的使用场景
当接口的实现类(或父类的子类)只使用一次时,可以使用匿名内部类简化代码。
匿名内部类示例
1. 实现接口的匿名内部类
public class Test {public static void main(String[] args) {// 使用匿名内部类实现Runnable接口Runnable r = new Runnable() {@Overridepublic void run() {System.out.println("这是匿名内部类实现的run方法");}};new Thread(r).start();// 更简洁的写法new Thread(new Runnable() {@Overridepublic void run() {System.out.println("直接创建匿名内部类");}}).start();}
}
2. 继承类的匿名内部类
abstract class Animal {public abstract void eat();
}public class Test {public static void main(String[] args) {// 使用匿名内部类继承抽象类Animal a = new Animal() {@Overridepublic void eat() {System.out.println("狗吃骨头");}};a.eat();}
}
3. 带参数的匿名内部类
interface Calculator {int calculate(int a, int b);
}public class Test {public static void main(String[] args) {// 使用匿名内部类实现带参数的接口Calculator c = new Calculator() {@Overridepublic int calculate(int a, int b) {return a + b;}};System.out.println("计算结果:" + c.calculate(10, 20));}
}
内部类的实际应用
1. 实现多重继承
Java不支持类的多继承,但可以通过内部类模拟实现:
class A {public void methodA() {System.out.println("来自A类的方法");}
}class B {public void methodB() {System.out.println("来自B类的方法");}
}// 通过内部类实现对A和B功能的同时使用
class C {// 继承A的内部类private class InnerA extends A {public void methodA() {super.methodA();}}// 继承B的内部类private class InnerB extends B {public void methodB() {super.methodB();}}// 对外提供方法public void methodA() {new InnerA().methodA();}public void methodB() {new InnerB().methodB();}
}
2. 封装实现细节
内部类可以用来隐藏实现细节,如集合类中的迭代器实现:
public class MyArrayList<E> {private Object[] elements;private int size;// 其他代码...// 使用内部类实现迭代器private class MyIterator implements Iterator<E> {private int cursor;@Overridepublic boolean hasNext() {return cursor < size;}@Overridepublic E next() {if (cursor >= size) {throw new NoSuchElementException();}return (E) elements[cursor++];}}// 对外提供获取迭代器的方法public Iterator<E> iterator() {return new MyIterator();}
}
3. 回调机制
匿名内部类常用于实现事件监听和回调:
// 在Swing中使用匿名内部类处理按钮点击
JButton button = new JButton("点击我");
button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("按钮被点击了!");}
});
内部类与Lambda表达式
在Java 8之后,对于只有一个抽象方法的接口(函数式接口),可以使用Lambda表达式代替匿名内部类,使代码更加简洁:
// 使用匿名内部类
Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("使用匿名内部类");}
};// 使用Lambda表达式
Runnable r2 = () -> System.out.println("使用Lambda表达式");// 启动线程
new Thread(r1).start();
new Thread(r2).start();// 直接使用Lambda创建线程
new Thread(() -> System.out.println("直接使用Lambda")).start();
内部类编译后的文件命名规则
编译含有内部类的Java文件后,会生成多个.class文件:
- 成员内部类:
外部类名$内部类名.class
- 静态内部类:
外部类名$内部类名.class
- 局部内部类:
外部类名$数字内部类名.class
- 匿名内部类:
外部类名$数字.class
例如,如果有以下类定义:
public class Outer {class Inner {}static class StaticInner {}public void method() {class LocalInner {}new Runnable() {public void run() {}};}
}
编译后将生成以下文件:
Outer.class
Outer$Inner.class
Outer$StaticInner.class
Outer$1LocalInner.class
Outer$1.class
(匿名内部类)
内部类面试常见问题
1. 内部类的各种差异比较
特性 | 成员内部类 | 静态内部类 | 局部内部类 | 匿名内部类 |
---|---|---|---|---|
定义位置 | 类成员位置 | 类成员位置 | 方法内部 | 方法内部 |
访问修饰符 | 可以使用 | 可以使用 | 不能使用 | 不能使用 |
是否可静态 | JDK16前不可 | 可以 | 不可以 | 不可以 |
是否需要外部类对象 | 需要 | 不需要 | 需要 | 需要 |
是否可以访问外部类非静态成员 | 可以 | 不可以 | 可以 | 可以 |
是否可以访问外部类静态成员 | 可以 | 可以 | 可以 | 可以 |
2. 为什么局部内部类只能访问final局部变量?
这是因为局部变量在方法结束后就会被销毁,而局部内部类对象可能在方法结束后仍然存在。如果允许内部类修改局部变量,当变量已经被销毁后,内部类却还引用这个变量,会导致数据不一致。为了解决这个问题,Java要求局部内部类访问的局部变量必须是final的(Java 8后可以是effectively final)。
内部类与外部类的关系
内部类与外部类的关联
-
内部类持有外部类的引用
- 非静态内部类隐式持有外部类的引用(
Outer.this
) - 这也是为什么非静态内部类能访问外部类所有成员的原因
- 注意:这可能导致内存泄漏,当内部类对象生命周期比外部类对象长时
- 非静态内部类隐式持有外部类的引用(
-
编译后的实现细节
- 内部类编译后会生成独立的
.class
文件 - 非静态内部类的构造函数会隐式接收外部类的引用
- 访问外部类私有成员时,编译器会生成特殊的访问方法
- 内部类编译后会生成独立的
// 编译前的代码
public class Outer {private int x = 10;class Inner {void access() {System.out.println(x); // 访问外部类的私有成员}}
}// 编译器处理后的逻辑(简化表示)
public class Outer {private int x = 10;// 为内部类提供的访问方法static int access$000(Outer outer) {return outer.x;}class Inner {final Outer this$0; // 持有外部类引用Inner(Outer outer) {this$0 = outer; // 保存外部类引用}void access() {System.out.println(Outer.access$000(this$0)); // 通过特殊方法访问}}
}
总结
内部类是Java中一个强大的特性,它允许我们在一个类中定义另一个类,增强了封装性和代码的组织结构。主要分为四种类型:
- 成员内部类:像普通成员一样的内部类
- 静态内部类:使用static修饰的内部类
- 局部内部类:定义在方法中的内部类
- 匿名内部类:没有名字的内部类
内部类存在的主要意义:
- 提高封装性,隐藏实现细节
- 实现类似多重继承的功能
- 更好地组织逻辑上紧密相关的类
- 简化事件处理和回调机制的实现
- 提供更灵活的访问控制
使用内部类的建议:
- 当一个类只对另一个类有用时,考虑使用内部类
- 需要访问外部类私有成员时,使用非静态内部类
- 不需要访问外部类实例成员时,优先使用静态内部类(减少内存引用)
- 仅在方法内使用的类,定义为局部内部类
- 实现接口或扩展类且只使用一次时,考虑使用匿名内部类或Lambda表达式
随着Java的发展,内部类与Lambda表达式、方法引用等新特性结合使用,可以使代码更加简洁和易读。掌握内部类是成为Java高级开发者的必备技能。
相关文章:
Java中的内部类详解
目录 什么是内部类? 生活中的内部类例子 为什么需要内部类? 生活中的例子 内部类的存在意义 内部类的分类 1. 成员内部类 什么是成员内部类? 成员内部类的特点 如何使用成员内部类? 成员内部类访问外部类同名成员 2. …...
【LangChain全栈开发指南】从LLM集成到智能体系统构建
目录 🌟 前言🏗️ 技术背景与价值💢 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🔍 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🧩 关键技术模块说明⚖️ 技术选…...
《内存单位:解锁数字世界的“度量衡”》
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、基础单位:字节(Byte)二、进阶单位:千字节(KB)、兆字节(MB)…...
Spring Boot + MyBatis-Plus 高并发读写分离实战
引言 在高并发场景下,单一数据库实例往往成为性能瓶颈。数据库读写分离通过将读操作和写操作分配到不同的数据库实例,有效缓解主库压力,提升系统吞吐量。MyBatis-Plus 作为一款强大的持久层框架,结合 Spring Boot 能够轻松实现读…...
STC32G12K128-旋转编码器-软件去抖
STC32G12K128-旋转编码器-软件去抖 简介代码 简介 EC11旋转编码器是一种可以连续旋转的器件A,B,C为旋转编码引脚,带按键的有D,E引脚。引脚功能: A:编码器A相;B:编码器B相;C:公共端-一般接到GN…...
第J7周:对于ResNeXt-50算法的思考
目录 思考 一、代码功能分析 1. 构建 shortcut 分支(残差连接的旁路) 2. 主路径的第一层卷积(11) 4. 主路径的第三层卷积(11) 5. 残差连接 激活函数 二、问题分析总结:残差结构中通道数不一致的…...
古方焕新潮!李良济盒马联名养生水,以创新赋能中式养生新潮流
今天下午,中华老字号李良济与新零售巨头盒马联名的“五汁饮&暑清元气水”新品发布会,在李良济隆重举行。 新品发布会上,盒马与多家媒体齐聚李良济,通过中医文化体验、新品品鉴、生产全链路探秘、媒体采访等环节,不…...
使用PyTorch训练马里奥强化学习代理的完整指南
以下是使用PyTorch训练马里奥强化学习代理的完整指南,涵盖依赖库配置、环境搭建、核心代码实现及输出结果分析,结合关键优化策略与实战经验。 一、依赖库配置 基础环境安装 # 使用Anaconda创建虚拟环境(推荐) conda create -n m…...
STM32F103RCT6 + MFC实现网口设备搜索、修改IP、固件升级等功能
资源下载链接:https://download.csdn.net/download/qq_35831134/90712875?spm=1001.2014.3001.5501 一.大概逻辑: // 网口搜索大概逻辑: // ************************************************************************** // 一.环境: // 上位机用MFC下位机用STM32F103R…...
ch09 课堂参考代码
ch09 拓扑排序与基环树 拓扑排序 在一些场景中,需要完成一系列事情,这些事情之间有顺序关系或者依赖关系,在做一件事情之前必须先做另一件事,例如课程学习的先后顺序,这类问题可以抽象为图论中的拓扑排序问题。 拓扑…...
Day 15 训练
Day 15 对鸢尾花数据集进行处理,特征可视化,贝叶斯优化随机森林,Shap解释1. 导入必要的库2. 设置中文字体3. 加载数据集4. 查看数据5. 数据准备6. 贝叶斯优化随机森林7. 评估结果8. 绘制箱形图9. 绘制特征相关性热力图10. SHAP模型解释总结 对…...
Path to Integer_ABC402分析与解答
考虑怎么降低复杂度,使用分治策略降低搜索的复杂度。 对于a_i,j,其一定在最后结果数的第(2n-i-j)位(如果将最低位看成第0位),故将a_i,j看成a_i,j * 10^(2n-i-j),这样每次加上a_i,j就可以了。 从(1,1)到(n…...
嵌入式学习笔记 - 关于结构体成员地址对齐问题
一 在没有#pragma pack()这个宏声明的情况下 C语言中结构体成员分配内存大小时需要满足2个条件,这也是内存对齐的原则: ①每个成员变量的起始地址必须为其数据类型所占空间大小的整数倍 ②结构体所占空间总大小为其最大数据类…...
JAVA实战开源项目:健身房管理系统 (Vue+SpringBoot) 附源码
本文项目编号 T 180 ,文末自助获取源码 \color{red}{T180,文末自助获取源码} T180,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
升级element-ui步骤
1 执行 cnpm uninstall element-ui 删除element-ui依赖2 执行 cpm install element-ui -S 安装最新的element-ui,并加入到packjson中3 在element-ui中生成主题,并将主题文件加入到element-ui-theme中。删除所有旧版本到主题文件 *4 修改element-ui-theme…...
Dp通用套路(闫式)
闫式dp分析法: 从集合角度来分析DP问题。 核心思想: DP是一种求有限集中的最值或者个数问题 由于集合中元素的数量都是指数级别的,直接用定义去求,把每种方案都用dfs暴力枚举一遍,时间复杂度很高,此时用…...
如何删除豆包本地大模型
由于无法选择大模型的安装位置,因此会占用C盘大量空间,然后又找到不卸载的地方,经排查豆包大模型安装位为:C:\Users\[当前电脑用户]\AppData\Local\Doubao\User Data,只能进行手动卸载。...
在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置
在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置如下图所示 将DemClearDTCLimitation参数改成DEM_ALL_SUPPORTED_DTCS 此时0x14 服务就可以支持单个DTC的故障清除, 如果配置成 DEM_ONLY_CLEAR_ALL_DTCS 则只能够用0x14服务清楚所有DTC。...
Linux59 SSH配置前瞻 JumpServer双网卡ping通
为什么Ping这个IP地址Ping得通 本地址 [rootlocalhost network-scripts]# cat ifcfg-ens33 iTYPEEthernet BOOTPROTOnone DEFROUTEyes DEVICEens33 ONBOOTno IPADDR192.168.235.4 NETMASK255.255.255.0 GATEWAY192.168.235.2 DNS1114.114.114.114 [rootlocalhost network-scrip…...
TensorFlow中数据集的创建
目录 前言示例示例1示例2示例3示例4 前言 TensorFlow 的 tf.data.Dataset API 提供了一种灵活且高效的方式来加载和预处理数据。它可以轻松处理大规模数据集,并支持多种数据源格式。 所有数据集相关的内容都在tf.data中,from_tensor_slices:…...
OpenHarmony SystemUI开发——实现全局导航栏和状态栏关闭
在实际生产中,进场遇到需要关闭导航栏和状态栏的需求,现分享解决办法: 开发环境 OpenHarmony 5.0.0r 代码分析 思路: launcher本身可以关闭 导航栏(实际是 公共事件,发送消息给systemUI来实控制&#x…...
机器视觉的平板电脑屏幕组件覆膜应用
在现代智能制造业中,平板电脑屏幕组件覆膜工序是确保产品外观和功能完整性的重要环节。随着技术的进步,传统的覆膜方式已经无法满足高速度、高精度的生产需求。而MasterAlign视觉系统的出现,将传统覆膜工艺转变为智能化、自动化的生产流程。在…...
Windows 10 无法启动或黑屏的修复指南(适用于更新失败或磁盘故障)
Windows 10 无法启动或黑屏的修复指南(适用于更新失败或磁盘故障) 当 Windows 10 突然无法启动(黑屏、无限重启、更新失败后断电等情况),很可能是由于启动引导程序损坏或系统映像异常(如系统磁盘出现坏道&…...
AI星智协脑:智能驱动的高效协作管理平台全解读
前言 想象一下:早上刚开电脑,十几条未读消息如机关枪般扫射而来,各路任务像陨石雨一样砸向你,会议排得比热播剧还密集,文档版本堪比宫斗剧剧情反转,同事围着你转圈追KPI,活脱脱一场《职场大逃杀…...
WebSocket:实时通信的新时代
在现代Web应用中,实时通信变得越来越重要。传统的HTTP协议虽然能够满足基本的请求-响应模式,但在需要频繁更新数据的场景下,其效率和性能显得捉襟见肘。WebSocket协议应运而生,它提供了一种在单个TCP连接上进行全双工通信的机制&a…...
NetSuite Saved Search如何在Criteria中利用Expressions处理不同Transaction之间的关系?
最近有几个Saved Search都用到了Criteria中的Use Expressions的参数,具体的场景是我们想要对不同的Transaction Type做出不同条件的限定,这里有两个不同的举例。 1.除了ER类型头和行的内容要根据实际取,其余所有Transaction类型都取头信息&a…...
2025年 全新 AI 编程工具 Cursor 安装使用教程
一、Cursor 软件下载 首选,登录Cursor官网,进行软件下载,官网下载地址如下: Cursor AI IDE 下载 二、Cursor软件安装配置 此处以Windows10系统安装为例,下载完成之后,右键安装包,以管理员身份…...
跨平台编码规范文档
1. 引言 1.1 目的与范围 本编码规范旨在为软件开发团队提供统一的代码编写标准,以提高代码质量、可维护性和团队协作效率。适用于使用C#、Java、安卓和Web前端(HTML/CSS/JavaScript/TypeScript)的项目开发,不针对特定语言特性&a…...
Spring创建的线程池
在自动审核的方法上加上Async注解(标明要异步调用) Async//异步方法调用public void audit(WmNews wmNews) {//这个方法处理时间很长,单体异步思想,线程池}在自媒体引导类中使用EnableAsync注解开启异步调用 SpringBootApplicati…...
【深度学习新浪潮】苹果在显示算法技术上的研发进展调研
苹果的显示算法技术研发呈现三大趋势:AI深度整合(如HDR增强、动态校准)、多模态环境感知(光、温湿度、生物特征)、软硬件协同优化(芯片、传感器、算法深度耦合)。 一、动态刷新率与功耗管理 1. ProMotion技术的算法升级 技术修正: 像素级功耗管理:iPhone 13系列的Pr…...
图像画质算法记录(前言)
一、背景介绍 本篇主要是对图像画质增强相关,进行简单整理和记录。 二、整体流程 整体效果主要受到两部分影响: 1、前端isp处理。 2、后端画质增强。 三、isp常规流程 可以参考:刘斯宁:Understanding ISP Pipeline 四、后端画质…...
uniapp-商城-47-后台 分类数据的生成(通过数据)
在第46章节中,我们为后台数据创建了分类的数据表结构schema,使得可以通过后台添加数据并保存,同时使用云函数进行数据库数据的读取。文章详细介绍了如何通过前端代码实现分类管理功能,包括获取数据、添加、更新和删除分类。主要代…...
阿里云服务器数据库故障排查指南?
阿里云服务器数据库故障排查指南? 以下是针对阿里云服务器(如ECS自建数据库或阿里云RDS等托管数据库)的故障排查指南,涵盖常见问题的定位与解决方案: 一、数据库连接失败 检查网络连通性 ECS自建数据库 确认安全组规则放行数据库…...
服务器不备案有影响吗
在当今数字化的时代,服务器成为了众多企业和个人开展业务、展示自我的重要工具。然而,有一个问题常常被忽视,那就是服务器不备案到底有没有影响? 答案是肯定的!服务器不备案,影响可不小。据相关数据显示&a…...
LVGL9保姆级教程(源码获取)
文章目录 🌟 LVGL 9 源码获取全流程指南📥 获取 LVGL 9 源码✅ 官方 GitHub 仓库下载📌 下载步骤: 🛠️ 获取 LVGL Code::Blocks 工程源码下载步骤有两种方式:🚀 方法一:通过 README…...
【react组件】矩形框选小组件,鼠标左键选中 div,键盘 ESC 清空
在线预览 GitHub demo import React, { useState } from react; import Chooser from rc-chooser;const containerStyle: React.CSSProperties {display: flex,alignItems: center,justifyContent: center,flexWrap: wrap, };const boxStyle: React.CSSProperties {width:…...
数据结构5.0
大家好,今天是队列的知识哦~ 目录 一、概念 1.0单链表 2.0双链表 3.0数组 二、队列的方法 1.0 offer方法 2.0 poll方法 3.0 peek方法 4.0 isEmpty方法 三、队列的题目 1.0 用队列实现栈 2.0 用栈实现队列 3.0 设计循环队列 一、概念 数组 、单链表和双…...
Python字典:数据操作的核心容器
在Python编程生态中,字典(dict)是最常用且功能强大的内置数据结构之一。它以键值对(Key-Value Pair)的形式存储数据,为快速查找、灵活映射关系提供了天然支持。无论是数据清洗、算法实现还是Web开发&#x…...
Midjourney-V7:支持参考图片头像或背景生成新保真图
Midjourney-V7重磅升级Omni Reference:全能图像参考神器!再也不用担心生成图片货不对版了! 就在上周,Midjourney发版它最新的V7版本:Omini Reference,提供了全方位图像参考功能,它可以参考你提…...
【MySQL数据库】--SQLyog创建数据库+python连接
目录 1.连接本地数据库 2.创建数据库和表 3.使用 python读取数据 1.连接本地数据库 进入SQLyog 2.创建数据库和表 创建数据库gyp_test: CREATE DATABASE gyp_test CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 创建表student_grade: CREATE TABLE …...
深入解析:思维链模型在大语言模型中的应用与实践
在人工智能领域,大语言模型的发展正以前所未有的速度改变着我们的生活和工作方式。从早期的文本生成到如今的复杂推理,模型的能力不断进化。而其中,思维链(Chain-of-Thought, CoT)技术的出现,更是为大模型的…...
服务器多客户端连接核心要点(1)
刷题 服务器多客户端连接核心要点 多进程服务器 实现原理 fork子进程:每次accept新客户端后,调用fork创建子进程。独立处理:子进程负责与客户端通信(如read/write),父进程继续监听新连接。 特点 隔离性…...
SIGIR 2025端到端生成式推荐ETEGRec
文章目录 1. 背景2. 方法2.1 框架图2.2 问题定义2.3 Item Tokenizer2.4 Generative Recommender2.5 ⭐️Sequence-Item Alignment2.6 ⭐️Preference-Semantic Alignment2.7 交替优化 3. 总结 现阶段 GRM 大多是两阶段的模型,第一阶段进行内容理解-行为语义对齐&…...
rust 中的 EBNF 介绍
在 rust 参考手册中,有大量类似: 句法 MacroInvocation :SimplePath ! DelimTokenTreeDelimTokenTree :( TokenTree* )| [ TokenTree* ]| { TokenTree* }TokenTree :Token排除 定界符(delimiters) | DelimTokenTreeMacroInvocationSemi :SimplePath ! (…...
解决 Redis 缓存与数据库一致性问题的技术指南
Redis 缓存与数据库一致性是分布式系统中常见的挑战,尤其在高并发场景下(如电商、用户管理、对账系统)。Redis 作为高性能缓存,常用于加速数据访问,但其与数据库(如 MySQL)之间的数据同步可能因…...
LlamaIndex 第六篇 SimpleDirectoryReader
SimpleDirectoryReader 是将本地文件数据加载到 LlamaIndex 的最简单方式。虽然在实际生产场景中,您更可能需要使用 LlamaHub 提供的多种数据读取器(Reader),但 SimpleDirectoryReader 无疑是快速入门的理想选择。 支持的文件类型…...
window 显示驱动开发-配置内存段类型
视频内存管理器(VidMm)和显示硬件仅支持某些类型的内存段。 因此,内核模式显示微型端口驱动程序(KMD)只能配置这些类型的段。 KMD 可以配置内存空间段和光圈空间段,其中不同: 内存空间段由保存…...
【人工智能学习之动作识别TSM训练与部署】
【人工智能学习之动作识别TSM训练与部署】 基于MMAction2动作识别项目的开发一、MMAction2的安装二、数据集制作三、模型训练1. 配置文件准备2. 关键参数修改3. 启动训练4. 启动成功 ONNX模型部署方案一、环境准备二、执行转换命令 基于MMAction2动作识别项目的开发 一、MMAct…...
PostgreSQL冻结过程
1.冻结过程 冻结过程有两种模式,依特定条件而择其一执行。为方便起见,将这两种模式分别称为惰性模式(lazy mode)和迫切模式(eager mode)。 并发清理(Concurrent VACUUM)通常在内部…...
SSHv2公钥认证示例-Paramiko复用 Transport 连接
在 Paramiko 中复用 Transport 连接时,若要通过 公钥认证(而非密码)建立连接,需手动加载私钥并与 Transport 关联。以下是详细操作步骤及完整代码示例: 步骤 1:加载私钥文件 使用 RSAKey 或 Ed25519Key 类…...