重返JAVA之路——面向对象
目录
面向对象
1.什么是面向对象?
2.面向对象的特点有哪些?
3.什么是对象?
4.什么是类?
5.什么是构造方法?
6.构造方法的特性有哪些?
封装
1.什么是封装?
2.封装有哪些特点?
数据隐藏
接口简化
可维护性增强
复用性提高
3.为什么需要使用封装?
继承
1.什么是继承?
2.继承有哪些特点?
3.为什么要继承?
方法的重写
1.什么是方法的重写?
2.方法重写的要求是什么?
3.什么是重载?
4.重载的特点是什么?
5.重写和重载的区别是什么?
6.重写的设计原则是什么?
多态
1.什么是多态?
2.多态有哪些特点?
多态的缺陷:
3.为什么要使用多态?
4.实现多态的条件有哪些?
5.什么是多态中的向上转型和向下转型?
面向对象
1.什么是面向对象?
面向对象是解决问题的一种思想,主要是依靠对象之间的交互完成一件事情。
面向对象(Object-Oriented Programming, OOP)将现实世界中的事物抽象为具有状态(数据)和行为(功能)的对象,并通过对象之间的交互来设计和构建程序。
2.面向对象的特点有哪些?
面向对象的特点是:封装、继承和多态。
3.什么是对象?
定义:对象是现实世界中事物的抽象,是面向对象的基本单元,包含 状态(属性) 和 行为(方法)。
状态:举个例子,我现在创建了一个“学生”对象,这个对象他的年龄,性别,籍贯等等属于他的属性,也就是对象的状态(数据)。又或者说大家玩儿游戏,游戏中的角色的各种生命值,攻击力等等,这些属性属于“状态”。
行为:那么我这个学生或者某个游戏角色他们干了什么,这个属于我这个对象所执行的操作,比如他考试或者打怪。这就是用方法(函数)描述对象能执行的操作。
总的来说就是,它(对象),它中包含了(它的信息(属性),以及它要干什么(行为)。
4.什么是类?
定义:类是对象的模板(蓝图),定义了一类对象共有的属性和方法。
我们可以这样理解,类中其实就打包了这个对象的信息以及他要干什么。
那么我们就说对象是类的实例(Instance),通过 new 关键字创建。
//定义学生类
class Student{String name; //属性int age;void study(){System.out.println(name+"在学习");//状态}}
Scanner sc = new Student();
5.什么是构造方法?
定义:构造方法(Constructor)是类中的一种特殊方法,主要用于在创建对象时对对象进行初始化操作。
构造方法的主要作用是在创建对象时为对象的属性赋初始值。
如果我们使用构造方法,便可以初始化这个学生对象的属性。
// 构造方法,用于初始化学生对象的属性public Student(String name, int age) {this.name = name;this.age = age;
完整示例:
class Student {String name;int age;// 构造方法public Student(String name, int age) {this.name = name;this.age = age;}void study() {System.out.println(name + "在学习");}public static void main(String[] args) {// 创建 Student 对象,调用构造方法进行初始化Student stu = new Student("李四", 22);stu.study();}
}
6.构造方法的特性有哪些?
- 名字必须与类名相同
- 没有返回值类型,设置为void也不行
- 创建对象时由编译器自动调用,并在对象的生命周期内只调用一次。(也就是说创建对象之后只能调用一次构造方法。)
- 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
封装
1.什么是封装?
封装(Encapsulation)是将数据(类的属性)和操作数据的方法(类的方法)封装在一个独立的类中,并通过访问修饰符控制外部对内部数据的访问,从而实现数据隐藏和接口控制。
类的使用者不需要知道类是如何实现的。实现的细节被封装并且对用户隐藏起来,这被称为类的封装。
2.封装有哪些特点?
(1)数据隐藏:通过访问控制(如私有属性)禁止外部直接操作数据,确保数据安全与完整性,仅允许类内方法交互。
(2)接口简化:提供公共方法作为外部交互接口,隐藏内部实现细节,降低使用复杂度,提升代码易读性。
(3)可维护性增强:内部实现修改不影响外部调用(只要接口不变),减少代码耦合,降低维护成本与风险。
(4)复用性提高:封装后的类作为独立模块,可重复应用于不同场景,避免重复开发,提升代码利用率。
下面我们来详细讲解:
数据隐藏
想象你有一个存钱罐,里面装着你的零花钱。这个存钱罐就像是一个被封装起来的东西,它有一个小口子,你只能通过这个口子把钱放进去或者拿出来。存钱罐里面具体有多少钱,外面的人是看不到的,这就相当于数据被隐藏起来了。只有你自己知道怎么去操作这个存钱罐(就像类里面的方法可以操作数据),别人没办法直接把手伸进去动你的钱,这样就能保证你钱的安全,不会被别人乱花。
接口简化
还是拿存钱罐来说,对于其他人来讲,他们不需要知道存钱罐内部的构造是什么样的,也不用管钱在里面是怎么摆放的。他们只需要知道,把钱从那个小口子放进去,存钱罐就能帮他们把钱存起来;想取钱的时候,从那个小口子把钱拿出来就行。这就好比类提供了公共的方法,外部的人只需要知道怎么使用这些方法,而不用去了解类内部是怎么实现这些功能的,这样使用起来就简单多了。
可维护性增强
假如你觉得现在这个存钱罐不太好用了,想换一个新的存钱罐。只要新存钱罐也有同样的小口子,能实现存钱和取钱的功能,那么对于那些用这个存钱罐存钱取钱的人来说,他们根本不需要做任何改变,还是像以前一样把钱放进去、拿出来就行。在编程里,这就相当于修改类的内部实现,只要公共的接口(方法)不变,外部的代码就不用跟着改,维护起来就很方便。
复用性提高
你可以想象存钱罐是一个很实用的东西,在不同的地方都能用到。比如在家里,你可以用它存零花钱;在学校,你也可以用它存一些买文具的钱。同样的道理,封装好的类就像这个存钱罐一样,可以在不同的程序或者代码场景中被重复使用,不用每次都重新去设计一个存钱罐(编写相同的代码),这样能节省很多时间和精力。
3.为什么需要使用封装?
我们使用封装,可以保证数据的安全性,方便我们操作类中的数据。
举个例子:你有一个“银行卡”盒子,里面的余额是秘密,外面不能直接看或改。但盒子提供了“查询余额”“存钱”“取钱”按钮,每次取钱时按钮会检查余额够不够,确保不会取出负数。这就是封装!
继承
1.什么是继承?
定义:子类(派生类)可以继承父类(基类)的属性和方法,实现代码复用,并可以扩展或重写父类功能。
继承(inheritance)机制:它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生的类叫派生类。
继承主要解决的问题是:共性的抽取,实现代码复用。
就比如说,我现在有个学生类,此为父类,大学生为父类中的(子类),他继承了学生类所具有的所有所有的属性和行为。
又或者说你爸爸会开车(定义一个 “人类” 类,里面有 “开车” 的方法),你作为儿子(子类),可以直接继承爸爸的 “开车” 能力,不用自己重新学。
同时,你还能自己新增能力,比如 “开赛车”(子类独有的方法),或者把 “开车” 升级(比如爸爸开车很慢,你开车很快,重写父类方法)。
我们需要注意的是:子类并不是父类的一个子集。实际上,一个子类通常比它的父类包含更多的信息和方法。
2.继承有哪些特点?
(1)代码复用
(2)方法重写(覆盖,Override)
(3)扩展性与封装性
(4)在 Java 中一个类只能直接继承一个父类。
3.为什么要继承?
当然是为了实现共性抽取,代码的复用啦!同时支持在父类基础上扩展或修改功能,
继承使得你可以定义一个通用的类(父类),之后可以扩充为一个更加特定的类(子类)。
当子类继承父类之后,一定要先帮助父类进行构造,然后再构造子类自己。只能在子类当中,调用父类的构造方法。(注意:只能在子类当中,调用父类的构造方法!)
方法的重写
1.什么是方法的重写?
方法重写(Method Overriding)是面向对象编程里的一个关键特性,其指的是在子类中对父类里已有的方法进行重新定义。重写后的方法名、参数列表和返回类型与父类中的方法相同,不过方法体内容有所不同。
所以,方法的重写也被称为覆盖,重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
打个比方说,假设我目前定义了一个学生类和大学生类,大学生类是学生类的子类,我现在想更改大学生类,这时就可以使用方法的重写。通过方法重写,大学生(子类)能够重新定义从学生(父类)继承而来的方法,从而让大学生(子类)展现出和学生(父类)不一样的行为。
2.方法重写的要求是什么?
(1)方法名必须相同
(2)参数列表必须相同(类型,个数,顺序)
(3)返回值必须相同
(4)必须基于继承关系
(5)使用 @Override 注解标识重写的方法
我们需要注意的是,当我们想使用方法的重写,那么就必须遵守规则:
(1)被private修饰的方法不能进行重写;
(2)被static修饰的方法不能进行重写;
(3)被final修饰的方法不能进行重写(密封方法);
(4)子类重写父类方法时,访问修饰限定符不能比父类被重写方法的权限更严格(即范围更小),但可以更宽松(即范围更大)
-
若父类方法是
private:
因private权限最小(仅类内可见),子类无法访问该方法,不能重写。 -
若父类方法是默认权限(无修饰符,包内可见):
子类若与父类在同一包中,重写时可使用默认权限或更宽松的protected、public;若不在同一包中,因默认权限对子类不可见,不能使用默认权限重写,需选择protected或public(权限更宽泛)。 -
若父类方法是
protected:
子类重写时,可选择protected或更宽松的public,但不能使用默认权限或private(权限更严格)。 -
若父类方法是
public:
因public权限最大,子类重写时必须保持public,不能缩小为protected、默认权限或private。
(5)方法的返回值之前可以不同,但是必须是父子类关系(协变返回类型)
(6)构造方法不能发生重写
3.什么是重载?
重载(Overload)是指在同一个类中定义多个方法(行为),这些方法名字相同,不过参数列表不同。
重载的目的是让类能够根据不同的参数类型或参数数量来执行不同的操作。
重载就是你在一个类中,让多个方法共用一个名字,但根据参数(比如数量、类型)的不同,执行不同的操作。
举个例子,假如说我们在餐厅中,有个“做面条”的操作,做面条是方法名,如果顾客想吃素面,就只需要“面条”这一个参数;假如顾客想吃鸡蛋面,就需要“鸡蛋”+“面条”这两个参数。两个同样都是“做面条”的方法名,但由于参数不同(一个参数是面条,另一个是面条+鸡蛋),这就是重载。
4.重载的特点是什么?
(1)发生在同一个类中:同一个类里可以定义多个同名方法。
(2)参数列表不同:参数的类型、数量或者顺序不一样。
(3)编译时确定调用:编译器会根据调用时传入的参数来决定调用哪个方法
5.重写和重载的区别是什么?
- 重写:发生在子类和父类之间,方法签名相同,用于实现多态,运行时确定调用的方法。
- 重载:发生在同一个类中,方法名相同但参数列表不同,用于提供多种不同的调用方式,编译时确定调用的方法。
方法的重载是一个类的多态性表现,而方法的重写是子类对父类的一种多态性表现。
在重载中,我们必须修改参数列表、返回类型、访问修饰限定符。
| 区别点 | 重写(override) | 重载(overload) |
| 参数列表 | 一定不能修改 | 必须修改 |
| 返回类型 | 一定不能修改(除非可以构成父子关系) | 可以修改 |
| 访问限定符 | 一定不能做更严格的限制(可以降低限制) | 可以修改 |
6.重写的设计原则是什么?
- 静态绑定:也称为前期绑定(早绑定),在编译时,根据用户所传递实参类型就确定了具体调用哪个方法,典型的代表就是函数重载。
- 动态绑定:也称为后期绑定(婉绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定调用哪个类的方法,一般用于重写。
静态绑定一般发生在编译阶段,根据变量的声明类型确定调用的方法,由编译器直接生成对应的方法调用地址。一般我们在同一类里的方法重载会使用。
我们来看一个例子,假如你有一个同学,他既是程序员(声明类型),也是游戏高手(实际身份)。如果你叫“程序员来修电脑”(调用方法),不管他是不是程序员,编译器只会让他使用“程序员修电脑”的方法,不会管它是不是游戏高手。
那么动态绑定,一般发生在运行阶段,程序根据对象的实际类型,决定调用哪个方法。典型的代表就是方法的重写。
比如说,你说“我是一个人”(父类声明),但实际上你可能是“学生”、“老师”、“医生”(子类对象),当你需要工作时(调用重写的方法),你到底是学生写作业、老师讲课,还是医生看病,取决于你是谁。
所以,如果我们是 静态绑定 ,就要看 编译时 变量声明的类型。
当然,如果我们是 动态绑定 , 就要看 运行时 对象实际的类型。
多态
1.什么是多态?
定义:同一操作(如方法调用)在不同对象上表现的行为。
用通俗的话来讲,就是“同样的指令,不同的对象有不同的反应”。
举个例子,我们现在定义了一个动物类,猫、都是这个动物类的子类,他们都有会叫的“方法”,那么我们使用多态的话,就可以让不管是猫还是狗,都可以通过动物类来让这些子类使用它们的“方法(会叫)”,代码更简单,并且能实现代码复用。
2.多态有哪些特点?
多态的优点:
(1)能够降低代码的 "圈复杂度", 避免使用大量的 if - else
(2)可扩展能力更强
什么叫 "圈复杂度" ?
多态的缺陷:
3.为什么要使用多态?
我们使用多态,就可以在同一个接口下,统一处理不同的对象,并且减少大量的if-else的使用。
在面向对象编程中,多态是静态绑定(编译时绑定)和动态绑定(运行时绑定)的结合体。
所以多态能同时满足 “代码复用”(静态多态简化重载逻辑)和 “灵活扩展”(动态多态支持子类新增行为)的需求。
多态的本质是 “通过抽象接口隔离变化”:将不变的逻辑(父类定义的通用规则)与变化的实现(子类的具体行为)分离,使代码更易维护、扩展和复用。
当需要新增功能(如子类)时,只需定义新的子类并实现父类接口 / 方法,无需修改已有调用逻辑。
通过多态,可以将现实世界中的复杂对象抽象为统一模型(如 “动物”“图形”),忽略具体细节,聚焦共性行为,使代码更贴近真实场景的逻辑。
多态允许用自然语言中的 “泛化” 概念(如 “所有动物都会叫”)来设计程序,而非针对每个具体类型(“狗会叫、猫会叫”)编写重复逻辑,代码更易理解和维护。
使用多态我们就无需显式将子类对象转换为具体类型即可调用其重写的方法(通过父类引用直接调用),避免了大量冗余的类型检查和强制转换。
4.实现多态的条件有哪些?
(1)必须在继承体系下
(2)子类必须要对父类中的方法进行重写
(3)通过父类的引用调用重写的方法
5.什么是多态中的向上转型和向下转型?
向上转型是多态的实现基础,而向下转型是多态的补充手段。
多态依赖向上转型实现动态绑定,通过向下转型扩展功能。
向下转型: 将父类引用还原成子类对象。
举个例子:我们把 “大学生”(子类)看作 “学生”(父类),用 “学生” 的身份活动。此时能调用重写后的 “考试”(子类实现的考试形式)。但 “大学生特有的技能,用‘学生’身份(向上转型后)就用不出来”,(向上转型后,它只 “暴露” 父类的功能。)比如 “大学生实习” 这个技能,因为 “学生” 这个身份(父类)没定义这个功能。如果想使用 “实习”,就得向下转型把 “学生” 再转回 “大学生”(且得先确认这个 “学生” 本质上是 “大学生”)。
总结:
- 向上转型:把子类当父类用,隐藏子类特有的功能,用统一的 “大身份” 活动。
- 向下转型:把父类转回子类,但得先确认它 “本质” 是这个子类,才能用子类特有的功能。
相关文章:
重返JAVA之路——面向对象
目录 面向对象 1.什么是面向对象? 2.面向对象的特点有哪些? 3.什么是对象? 4.什么是类? 5.什么是构造方法? 6.构造方法的特性有哪些? 封装 1.什么是封装? 2.封装有哪些特点? 数据隐…...
Java设计模式全解析(共 23 种)
一、设计模式全解: Java 中的设计模式是为了解决在软件开发中常见问题的一些“最佳实践”总结。设计模式分为三大类,共 23 种经典模式: 1. 创建型模式(5 种) 用于对象的创建,解决对象实例化过程中的问题。…...
Python10天突击--Day 2: 实现观察者模式
以下是 Python 实现观察者模式的完整方案,包含同步/异步支持、类型注解、线程安全等特性: 1. 经典观察者模式实现 from abc import ABC, abstractmethod from typing import List, Anyclass Observer(ABC):"""观察者抽象基类""…...
springboot框架集成websocket依赖实现物联网设备、前端网页实时通信!
需求: 最近在对接一个物联网里设备,他的通信方式是 websocket 。所以我需要在 springboot框架中集成websocket 依赖,从而实现与设备实时通信! 框架:springboot2.7 java版本:java8 好了,还是直接…...
【玩泰山派】5、点灯,驱动led-(2)ubuntu18.04 升级python3.6到python3.7,安装pip3
文章目录 前言升级python3.71、安装 software-properties-common 包2、添加 deadsnakes PPA 源3、安装 Python 3.71. 安装 Python 3.72. 安装 Python 3.7 的开发包和虚拟环境支持(可选但推荐)3. 设置 Python 3.7 为默认版本4. 验证 Python 版本注意事项 …...
ES6学习03-字符串扩展(unicode、for...of、字符串模板)和新方法()
一、字符串扩展 1. eg: 2.for...of eg: 3. eg: 二。字符串新增方法 1. 2. 3. 4. 5....
c++中的this
在 C 中,this 是一个指向当前对象实例的指针,它隐式地存在于类的非静态成员函数中。以下是 this 的详细用法和常见场景: 1. 常见场景 明确成员归属:当成员变量与局部变量同名时,用 this-> 显式访问成员。当成员变量…...
目前状况下,计算机和人工智能是什么关系?
目录 一、计算机和人工智能的关系 (一)从学科发展角度看 计算机是基础 人工智能是计算机的延伸和拓展 (二)从技术应用角度看 二、计算机系学生对人工智能的了解程度 (一)基础层面的了解 必备知识 …...
Flutter 2025 Roadmap
2025 这个路线图是有抱负的。它主要代表了我们这些在谷歌工作的人收集的内容。到目前为止,非Google贡献者的数量超过了谷歌雇佣的贡献者,所以这并不是一个详尽的列表,列出了我们希望今年Flutter能够出现的所有令人兴奋的新事物!在…...
[数据结构]排序 --2
目录 8、快速排序 8.1、Hoare版 8.2、挖坑法 8.3、前后指针法 9、快速排序优化 9.1、三数取中法 9.2、采用插入排序 10、快速排序非递归 11、归并排序 12、归并排序非递归 13、排序类算法总结 14、计数排序 15、其他排序 15.1、基数排序 15.2、桶排序 8、快速排…...
第16届蓝桥杯c++省赛c组个人题解
偷偷吐槽: c组没人写题解吗,找不到题解啊 P12162 [蓝桥杯 2025 省 C/研究生组] 数位倍数 题目背景 本站蓝桥杯 2025 省赛测试数据均为洛谷自造,与官方数据可能存在差异,仅供学习参考。 题目描述 请问在 1 至 202504ÿ…...
记一次InternVL3- 2B 8B的部署测验日志
1、模型下载魔搭社区 2、运行环境: 1、硬件 RTX 3090*1 云主机[普通性能] 8核15G 200G 免费 32 Mbps付费68Mbps ubuntu22.04 cuda12.4 2、软件: flash_attn(好像不用装 忘记了) numpy Pillow10.3.0 Requests2.31.0 transfo…...
Android PowerManager功能接口详解
PowerManager 是 Android 系统中用于管理设备电源状态的核心服务,开发者可以通过它控制设备的唤醒、休眠、屏幕亮灭等行为。以下是对 PowerManager 核心功能接口的详细说明,包含使用场景、注意事项和代码示例。 1. 获取 PowerManager 实例 通过 Context…...
使用SSH解决在IDEA中Push出现403的问题
错误截图: 控制台日志: 12:15:34.649: [xxx] git -c core.quotepathfalse -c log.showSignaturefalse push --progress --porcelain master refs/heads/master:master fatal: unable to access https://github.com/xxx.git/: The requested URL return…...
Tauri 2.3.1+Leptos 0.7.8开发桌面应用--Sqlite数据库的写入、展示和选择删除
在前期工作的基础上(Tauri2Leptos开发桌面应用--Sqlite数据库操作_tauri sqlite-CSDN博客),尝试制作产品化学成分录入界面,并展示数据库内容,删除选中的数据。具体效果如下: 一、前端Leptos程序 前端程序主…...
关于 Java 预先编译(AOT)技术的详细说明,涵盖 GraalVM 的配置、Spring Boot 3.x 的集成、使用示例及优缺点对比
以下是关于 Java 预先编译(AOT)技术的详细说明,涵盖 GraalVM 的配置、Spring Boot 3.x 的集成、使用示例及优缺点对比: 1. 预先编译(AOT)技术详解 1.1 核心概念 AOT(Ahead-of-Time)…...
《车辆人机工程-》实验报告
汽车驾驶操纵实验 汽车操纵装置有哪几种,各有什么特点 汽车操纵装置是驾驶员直接控制车辆行驶状态的关键部件,主要包括以下几种,其特点如下: 一、方向盘(转向操纵装置) 作用:控制车辆行驶方向…...
使用多进程和 Socket 接收解析数据并推送到 Kafka 的高性能架构
使用多进程和 Socket 接收解析数据并推送到 Kafka 的高性能架构 在现代应用程序中,实时数据处理和高并发性能是至关重要的。本文将介绍如何使用 Python 的多进程和 Socket 技术来接收和解析数据,并将处理后的数据推送到 Kafka,从而实现高效的…...
Redis 哨兵模式 搭建
1 . 哨兵模式拓扑 与 简介 本文介绍如何搭建 单主双从 多哨兵模式的搭建 哨兵有12个作用 。通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。 当哨兵监测到master宕机,会自动将slave切换成master,然后通过…...
【网络安全 | 项目开发】Web 安全响应头扫描器(提升网站安全性)
原创项目,未经许可,不得转载。 文章目录 项目简介工作流程示例输出技术栈项目代码使用说明项目简介 安全响应头是防止常见 Web 攻击(如点击劫持、跨站脚本攻击等)的有效防线,因此合理的配置这些头部信息对任何网站的安全至关重要。 Web 安全响应头扫描器(Security Head…...
构建灵活的接口抽象层:支持多种后端数据存取的实战指南
构建灵活的接口抽象层:支持多种后端数据存取的实战指南 引言 在现代软件开发中,数据存取成为业务逻辑的核心组成部分。然而,由于后端数据存储方式的多样性(如关系型数据库、NoSQL数据库和文件存储),如何设计一套能够适配多种后端数据存取的接口抽象层,成为技术团队关注…...
计算机的发展及应用
一、计算机的发展历程 计算机的发展经历了从机械计算到电子计算的跨越,其核心驱动力是 硬件技术革新 和 体系结构演进,大致可分为以下阶段: 1. 前电子计算机时代(19世纪-20世纪40年代) 机械计算装置: 16…...
深入理解linux操作系统---第4讲 用户、组和密码管理
4.1 UNIX系统的用户和组 4.1.1 用户与UID UID定义:用户身份唯一标识符,16位或32位整数,范围0-65535。系统用户UID为0(root)、1-999(系统服务),普通用户从1000开始分配特殊UID&…...
【NLP】18. Encoder 和 Decoder
1. Encoder 和 Decoder 概述 在序列到序列(sequence-to-sequence,简称 seq2seq)的模型中,整个系统通常分为两大部分:Encoder(编码器)和 Decoder(解码器)。 Encoder&…...
Npfs!NpFsdCreate函数分析之从NpCreateClientEnd函数分析到Npfs!NpSetConnectedPipeState
第一部分: 1: kd> g Breakpoint 5 hit Npfs!NpFsdCreate: baaecba6 55 push ebp 1: kd> kc # 00 Npfs!NpFsdCreate 01 nt!IofCallDriver 02 nt!IopParseDevice 03 nt!ObpLookupObjectName 04 nt!ObOpenObjectByName 05 nt!IopCreateFile 06…...
基于PySide6与pycatia的CATIA绘图比例智能调节工具开发全解析
引言:工程图纸自动化处理的技术革新 在机械设计领域,CATIA图纸的比例调整是高频且重复性极强的操作。传统手动调整方式效率低下且易出错。本文基于PySide6+pycatia技术栈,提出一种支持智能比例匹配、实时视图控制、异常自处理的图纸批处理方案,其核心突破体现在: 操作效…...
STM32硬件IIC+DMA驱动OLED显示——释放CPU资源,提升实时性
目录 前言 一、软件IIC与硬件IIC 1、软件IIC 2、硬件IIC 二、STM32CubeMX配置KEIL配置 三、OLED驱动示例 1、0.96寸OLED 2、OLED驱动程序 3、运用示例 4、效果展示 总结 前言 0.96寸OLED屏是一个很常见的显示模块,其驱动方式在用采IIC通讯时,常用软件IIC…...
Spring Bean的创建过程与三级缓存的关系详解
以下以 Bean A 和 Bean B 互相依赖为例,结合源码和流程图,详细说明 Bean 的创建过程与三级缓存的交互。 1. Bean 的完整生命周期(简化版) #mermaid-svg-uwqaB5dgOFDQ97Yd {font-family:"trebuchet ms",verdana,arial,sa…...
IDEA 调用 Generate 生成 Getter/Setter 快捷键
快捷键不会用? 快捷键:AltInsert 全选键:CtrlA IDEA 调用 Generate 生成 Getter/Setter 快捷键 - 爱吃西瓜的番茄酱 - 博客园...
泛型的二三事
泛型(Generics)是Java语言的一个重要特性,它允许在定义类、接口和方法时使用类型参数(Type Parameters),从而实现类型安全的代码重用。泛型在Java 5中被引入,极大地增强了代码的灵活性和安全性。…...
