当前位置: 首页 > news >正文

Java面向对象三大特性深度解析

Java面向对象三大特性封装继承多态深度解析

  • 前言
  • 一、封装:数据隐藏与访问控制的艺术
    • 1.1 封装的本质与作用
    • 1.2 封装的实现方式
      • 1.2.1 属性私有化与方法公开化
      • 1.2.2 封装的访问修饰符
  • 二、继承:代码复用与类型扩展的核心机制
    • 2.1 继承的定义与语法
    • 2.2 继承的核心特性
      • 2.2.1 父类构造方法的调用
      • 2.2.2 方法重写(Override)
      • 2.2.3 `final`关键字的作用
    • 2.3 继承的优缺点与适用场景
  • 三、多态:同一接口下的差异化实现
    • 3.1 多态的定义与表现形式
    • 3.2 多态的实现方式
      • 3.2.1 基于继承的多态
      • 3.2.2 基于接口的多态
    • 3.3 多态的核心原理:动态绑定
    • 3.4 多态的优势与应用场景
  • 四、三大特性的协同应用:实战案例解析
    • 4.1 场景描述:银行账户系统
    • 4.2 代码实现
      • 4.2.1 封装:账户基类
      • 4.2.2 继承:信用卡账户子类
      • 4.2.3 多态:统一账户管理
    • 4.3 特性协同分析
  • 五、常见误区与最佳实践
    • 5.1 封装的误区:过度封装 vs 封装不足
    • 5.2 继承的误用:滥用继承 vs 组合优先
    • 5.3 多态的陷阱:父类引用的类型限制
  • 总结:三大特性的核心价值

前言

Java面向对象编程(OOP)是构建复杂软件系统的核心思想。而封装、继承、多态作为面向对象的三大特性,更是理解和掌握 Java 编程的基石。它们不仅规范了代码的结构,还提升了代码的可维护性、可复用性和扩展性。本文将通过原理剖析、代码示例和场景分析,全面解读这三大特性的本质与实践方法。

一、封装:数据隐藏与访问控制的艺术

1.1 封装的本质与作用

封装(Encapsulation) 是指将类的属性和实现细节隐藏起来,仅通过公共接口(方法)对外提供访问。其核心目标是:

保护数据完整性:避免外部代码直接操作属性,防止非法数据的写入。

简化调用逻辑:调用者只需关注接口的功能,无需了解内部实现细节。

隔离变化:内部实现的修改不会影响外部调用,符合 “开闭原则”。

1.2 封装的实现方式

1.2.1 属性私有化与方法公开化

通过将类的属性声明为private,并提供public修饰的 getter/setter 方法实现对属性的间接访问。

// 示例:学生类的封装
public class Student {// 属性私有化private String name;private int age;private String studentId;// 构造方法public Student(String name, int age, String studentId) {this.name = name;this.age = age;this.studentId = studentId;}// getter/setter 方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {// 添加数据校验逻辑if (age > 0 && age < 120) {this.age = age;} else {throw new IllegalArgumentException("年龄必须在1-119之间");}}public String getStudentId() {return studentId;}
}

关键点解析

数据校验:在setAge()方法中添加合法性检查,确保年龄属性始终为有效值。

只读属性:若属性不允许修改(如studentId),可不提供 setter 方法,实现只读封装。

1.2.2 封装的访问修饰符

Java 提供四种访问修饰符控制成员的可见性:

修饰符类内同包子类(不同包)全局
privateXXX
default(无)XX
protectedX
public

最佳实践

类的属性通常声明为private,方法根据需要选择合适的访问级别。

工具类或常量类可将构造方法声明为private,禁止实例化(如Math类)。

二、继承:代码复用与类型扩展的核心机制

2.1 继承的定义与语法

继承(Inheritance)是指子类(派生类)自动拥有父类(基类)的属性和方法,从而实现代码复用。Java 通过extends关键字实现继承,且只支持单继承(一个子类只能有一个父类)。

// 父类:Person
class Person {protected String name;protected int age;public Person(String name, int age) {this.name = name;this.age = age;}public void introduce() {System.out.println("姓名:" + name + ",年龄:" + age);}
}// 子类:Student 继承 Person
public class Student extends Person {private String studentId;public Student(String name, int age, String studentId) {super(name, age); // 调用父类构造方法this.studentId = studentId;}// 新增子类特有的方法public void study() {System.out.println("学生" + name + "正在学习");}
}

2.2 继承的核心特性

2.2.1 父类构造方法的调用

子类构造方法必须通过super()显式调用父类构造方法,若未显式调用,编译器会自动添加无参super()

super()必须是子类构造方法的第一行代码,且只能调用一次。

// 错误示例:super() 不在第一行
public Student(String name, int age, String studentId) {this.studentId = studentId; // 错误,必须先调用 super()super(name, age);
}

2.2.2 方法重写(Override)

子类可以重新实现父类的非final方法,以满足特定需求。重写需遵循以下规则:

方法签名必须一致:方法名、参数列表、返回类型(允许协变返回类型)需与父类方法相同。

访问修饰符不小于父类:子类方法的访问修饰符不能比父类更严格(如父类方法为protected,子类不能声明为default)。

不能抛出更宽泛的异常:子类方法抛出的异常不能是父类方法抛出异常的父类(可抛出子类异常或不抛出)。

// 示例:重写父类的 introduce 方法
class Student extends Person {// 重写 introduce 方法@Override // 注解显式标识重写,编译器会校验public void introduce() {super.introduce(); // 调用父类实现System.out.println("学号:" + studentId);}
}

2.2.3 final关键字的作用

final:不能被继承(如String类)。

final方法:不能被重写。

final变量:值不可修改(常量)。

2.3 继承的优缺点与适用场景

优点

代码复用,减少冗余。

符合 “is-a” 关系(如学生是一个人),逻辑清晰。

缺点

父类修改可能影响所有子类,耦合度较高。

单继承限制,无法同时继承多个类的特性。

适用场景

类之间存在明确的层次关系(如动物→哺乳动物→人类)。

需要在现有类基础上扩展新功能(如在ArrayList基础上实现线程安全的Vector)。

三、多态:同一接口下的差异化实现

3.1 多态的定义与表现形式

多态(Polymorphism) 是指相同的方法调用,不同的对象可能产生不同的行为。多态的实现需要满足以下条件:

继承或实现接口:子类与父类存在继承关系,或类实现接口。

方法重写:子类重写父类的方法或实现接口的方法。

父类引用指向子类对象:通过父类类型的变量引用子类对象。

3.2 多态的实现方式

3.2.1 基于继承的多态

// 父类:动物
class Animal {public void speak() {System.out.println("动物发出声音");}
}// 子类:狗
class Dog extends Animal {@Overridepublic void speak() {System.out.println("汪汪汪");}
}// 子类:猫
class Cat extends Animal {@Overridepublic void speak() {System.out.println("喵喵喵");}
}// 多态调用
public class PolymorphismDemo {public static void main(String[] args) {Animal animal1 = new Dog(); // 父类引用指向子类对象Animal animal2 = new Cat();animal1.speak(); // 输出:汪汪汪(调用 Dog 的方法)animal2.speak(); // 输出:喵喵喵(调用 Cat 的方法)}
}

3.2.2 基于接口的多态

// 接口:交通工具
interface Vehicle {void start(); // 启动方法
}// 实现类:汽车
class Car implements Vehicle {@Overridepublic void start() {System.out.println("汽车点火启动");}
}// 实现类:自行车
class Bicycle implements Vehicle {@Overridepublic void start() {System.out.println("自行车蹬踏启动");}
}// 多态调用
public class InterfacePolymorphism {public static void startVehicle(Vehicle vehicle) {vehicle.start(); // 同一方法,不同实现}public static void main(String[] args) {startVehicle(new Car());   // 输出:汽车点火启动startVehicle(new Bicycle()); // 输出:自行车蹬踏启动}
}

3.3 多态的核心原理:动态绑定

在 Java 中,方法调用的绑定分为静态绑定动态绑定

静态绑定:编译阶段确定调用的方法(如静态方法、私有方法、构造方法)。

动态绑定:运行阶段根据对象的实际类型确定调用的方法(多态的本质)。

执行流程

编译器检查父类中是否存在该方法,若不存在则报错(静态绑定阶段)。

运行时根据对象的实际类型(如DogCat),调用子类重写后的方法(动态绑定阶段)。

3.4 多态的优势与应用场景

优势

可扩展性:新增子类无需修改现有调用代码(如新增Bird类,只需重写speak方法)。

接口统一:不同类通过统一接口交互,降低耦合度(如Vehicle接口统一交通工具的启动逻辑)。

典型应用场景

模板方法模式:父类定义算法骨架,子类实现具体步骤(如日志框架的日志记录流程)。

Spring 依赖注入:通过接口注入实现类,运行时动态切换实现(如UserService接口注入不同的实现类)。

集合框架ListSet等接口的多态实现(如ArrayListLinkedList)。

四、三大特性的协同应用:实战案例解析

4.1 场景描述:银行账户系统

设计一个银行账户系统,包含普通账户(NormalAccount)和信用卡账户(CreditAccount),要求:

账户信息(余额、户主)需封装,通过接口访问。

信用卡账户继承普通账户,并新增透支额度功能。

通过多态实现账户的统一管理(如计算利息、打印账户信息)。

4.2 代码实现

4.2.1 封装:账户基类

// 账户基类(封装)
abstract class Account {private double balance;private String owner;public Account(String owner, double balance) {this.owner = owner;this.balance = balance;}// 计算利息(抽象方法,由子类实现)public abstract double calculateInterest();// 封装的存款方法public void deposit(double amount) {if (amount > 0) {balance += amount;}}// 封装的取款方法(普通账户不允许透支)public boolean withdraw(double amount) {if (balance >= amount && amount > 0) {balance -= amount;return true;}return false;}// getter 方法public double getBalance() {return balance;}public String getOwner() {return owner;}
}

4.2.2 继承:信用卡账户子类

// 信用卡账户(继承与扩展)
class CreditAccount extends Account {private double overdraftLimit; // 透支额度public CreditAccount(String owner, double balance, double overdraftLimit) {super(owner, balance);this.overdraftLimit = overdraftLimit;}// 重写取款方法,支持透支@Overridepublic boolean withdraw(double amount) {double available = getBalance() + overdraftLimit;if (amount > 0 && amount <= available) {if (amount > getBalance()) {overdraftLimit -= (amount - getBalance());}super.withdraw(amount);return true;}return false;}// 实现抽象方法:信用卡利息计算(假设年利率5%)@Overridepublic double calculateInterest() {return getBalance() * 0.05 + overdraftLimit * 0.03;}// 新增方法:查询透支额度public double getOverdraftLimit() {return overdraftLimit;}
}

4.2.3 多态:统一账户管理

// 多态应用:账户管理类
public class AccountManager {// 统一计算利息的方法public static double calculateTotalInterest(Account[] accounts) {double totalInterest = 0;for (Account account : accounts) {totalInterest += account.calculateInterest(); // 多态调用}return totalInterest;}public static void main(String[] args) {Account normalAccount = new Account("张三", 10000) {// 匿名内部类实现普通账户的利息计算(假设年利率3%)@Overridepublic double calculateInterest() {return getBalance() * 0.03;}};CreditAccount creditAccount = new CreditAccount("李四", 5000, 10000);Account[] accounts = {normalAccount, creditAccount};double totalInterest = calculateTotalInterest(accounts);System.out.println("总利息:" + totalInterest); // 输出:10000*0.03 + (5000*0.05 + 10000*0.03) = 300 + 550 = 850}
}

4.3 特性协同分析

封装:账户的余额和操作细节通过private属性和公共方法隐藏,确保数据安全。

继承CreditAccount继承Account,复用存款、查询余额等功能,并扩展透支逻辑。

多态:通过Account父类引用处理不同子类对象,统一计算利息,新增账户类型时无需修改现有逻辑。

五、常见误区与最佳实践

5.1 封装的误区:过度封装 vs 封装不足

过度封装:将所有方法都声明为private,导致子类无法扩展,违背 “里氏替换原则”。

封装不足:属性直接暴露为public,失去数据保护能力。最佳实践:属性必私有,方法按 “最小必要原则” 选择访问修饰符。

5.2 继承的误用:滥用继承 vs 组合优先

滥用继承:为了代码复用而强行继承(如 “企鹅” 继承 “鸟”,但企鹅不会飞),违背 “is-a” 原则。

组合优先:当类之间是 “has-a” 关系时(如 “汽车” 有 “引擎”),优先使用组合而非继承。

5.3 多态的陷阱:父类引用的类型限制

父类引用只能调用父类中声明的方法,即使子类新增了方法,也无法通过父类引用访问。

Animal animal = new Dog();
animal.study(); // 编译错误,Animal 类中没有 study() 方法

解决方案:若需要调用子类特有方法,需进行类型强制转换(需结合instanceof判断,避免ClassCastException)。

总结:三大特性的核心价值

特性核心目标典型场景关键代码要素
封装数据保护与接口抽象类的属性管理、配置类设计private属性、getter/setter
继承代码复用与类型扩展类层次结构设计、功能扩展extends关键字、super调用
多态接口统一与动态行为框架设计、算法策略切换父类引用、方法重写、instanceof

面向对象的三大特性并非孤立存在,而是相互协作、相辅相成:封装是基础,继承是手段,多态是目标。通过封装隐藏实现细节,通过继承建立类间关系,通过多态实现动态扩展,最终构建出结构清晰、可维护性强的软件系统。掌握这三大特性,不仅能提升代码质量,更能培养面向对象的编程思维,为复杂系统设计奠定坚实基础。

若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ

相关文章:

Java面向对象三大特性深度解析

Java面向对象三大特性封装继承多态深度解析 前言一、封装&#xff1a;数据隐藏与访问控制的艺术1.1 封装的本质与作用1.2 封装的实现方式1.2.1 属性私有化与方法公开化1.2.2 封装的访问修饰符 二、继承&#xff1a;代码复用与类型扩展的核心机制2.1 继承的定义与语法2.2 继承的…...

C 语言学习笔记(8)

内容提要 数组 数组的概念一维数组 数组 数组的概念 什么是数组 数组是相同类型&#xff0c;有序数据的集和 数组的特征 数组中的数据被称之为数组的元素&#xff08;所谓的元素&#xff0c;其实就是数组的每一个匿名的变量空间&#xff09;&#xff0c;是同构。数组中的…...

Screen Mirroring App:轻松实现手机与电视的无缝投屏

Screen Mirroring App 是一款由2kit consulting发行的电视投屏软件&#xff0c;专为用户提供便捷的投屏解决方案。它支持将手机和平板屏幕上的内容实时投射到大电视上&#xff0c;无论是观看影视作品、玩游戏、浏览照片还是阅读电子书&#xff0c;都能提供清晰、稳定的画质和流…...

html js 原生实现web组件、web公共组件、template模版插槽

在现代浏览器中&#xff0c;通过 class 继承 HTMLElement 可以轻松创建原生 Web Components&#xff08;自定义元素&#xff09;&#xff0c;并能享受与普通 HTML 元素同等的语义和性能优势。下面将从核心概念、生命周期方法、Shadow DOM、表单关联、自定义属性、以及与 Vue 3 …...

【爬虫】DrissionPage-2

之前的三个对象是4.0版本&#xff0c;看到的是网上大佬们网上的文章&#xff0c;因为看到官网更新了4.1&#xff0c;我觉得有必要了解一下&#xff1a;文档地址&#xff1a;&#x1f4a5; 4.1 功能介绍 | DrissionPage官网 点击链接看官网就行&#xff0c;下面一样的。 4.1 的…...

鸿蒙OSUniApp 制作个人信息编辑界面与头像上传功能#三方框架 #Uniapp

UniApp 制作个人信息编辑界面与头像上传功能 前言 最近在做一个社交类小程序时&#xff0c;遇到了需要实现用户资料编辑和头像上传的需求。这个功能看似简单&#xff0c;但要做好用户体验和兼容多端&#xff0c;还是有不少细节需要处理。经过一番摸索&#xff0c;总结出了一套…...

系统漏洞扫描服务:维护网络安全的关键与服务原理?

系统漏洞扫描服务是维护网络安全的关键措施&#xff0c;能够迅速发现系统中的潜在风险&#xff0c;有效预防可能的风险和损失。面对网络攻击手段的日益复杂化&#xff0c;这一服务的重要性日益显著。 服务原理 系统漏洞扫描服务犹如一名恪尽职守的安全守护者。它运用各类扫描…...

[原创](现代C++ Builder 12指南): 在界面开发中, 如何利用C++高级特性“折叠表达式“?.

[序言] 在现代C++编程中, 现代C++引入的折叠表达式(Fold Expressions)是一项极具价值的特性, 它为模板编程带来了更高的灵活性和简洁性. 折叠表达式允许在参数包上执行简洁的折叠操作, 从而减少冗余代码, 提升代码的可读性与维护性. 在界面开发领域, 特别是使用C++ Builder 12进…...

KUKA机器人中断编程3—暂停功能的编程

在KUKA机器人的使用过程中&#xff0c;对于调试一个项目&#xff0c;当遇到特殊情况时需要暂停机器人&#xff0c;等异常情况处理完成后再继续机器人的程序运行。wait for指令是等待一个输入信号指令&#xff0c;没有输入信号&#xff0c;机器人一直等待。在一定程度上程序也不…...

【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;LeetCode 热题 100 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 相交链表反转链表回文链表环形链表环形链表 II合并两个有序链表两数相加删除链表的倒数第 N 个结点两两交换链表中的…...

Seata源码—1.Seata分布式事务的模式简介

大纲 1.Seata分布式事务框架简介 2.Seata AT模式实现分布式事务的机制 3.Seata AT模式下的写隔离机制 4.Seata AT模式下的读隔离机制 5.官网示例说明Seata AT模式的工作机制 6.Seata TCC模式的介绍以及与AT模式区别 7.Seata Saga模式的介绍 8.单服务多个库的分布式事务…...

牛客——签到题

分析 我拿到题就去看了示例&#xff0c;可以发现&#xff0c;并非是让难度最小&#xff0c;或者难度系数出现次数最多的成为签到题的难度。那我就有点懵了。。。。。。 但仔细观察题目本身的特定条件和目标&#xff0c;即在满足选择 m 道题的前提下&#xff0c;尽可能多地选择…...

【idea】调试篇 idea调试技巧合集

前言&#xff1a;之前博主写过一篇idea技巧合集的文章&#xff0c;由于技巧过于多了&#xff0c;文章很庞大&#xff0c;所以特地将调试相关的技巧单独成章, 调试和我们日常开发是息息相关的&#xff0c;用好调试可以事半功倍 文章目录 1. idea调试异步线程2. idea调试stream流…...

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持

k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…...

直流电机风速仪

在处理直流电机风速仪的 ADC 读取问题时&#xff0c;下面为你详细介绍实现方法。 硬件连接 风速仪的输出通常是模拟信号&#xff0c;所以需要把它连接到微控制器的 ADC 输入引脚。比如&#xff0c;在 Arduino 上可以连接到 A0 - A5 这类模拟输入引脚。 ADC 读取原理 风速仪…...

dify 连接不上ollama An error occurred during credentials validation:

三大报错 An error occurred during credentials validation: HTTPConnectionPool(hosthost.docker.internal, port11434): Max retries exceeded with url: /api/chat (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x7f26fc3c00b0&…...

19、云端工业物联网生态组件 - 工厂能效与预测维护 - /数据与物联网组件/cloud-iiot-factory-analysis

76个工业组件库示例汇总 云端工业物联网生态组件 - 工厂能效与预测维护 (模拟) 概述 这是一个交互式的 Web 组件&#xff0c;旨在模拟一个云端工业物联网 (IIoT) 平台的核心界面&#xff0c;专注于工厂层面的能效分析和基于传感器数据的预测性维护概念。用户可以监控模拟的设…...

python打卡day25

python的异常处理机制 知识点回顾&#xff1a; 异常处理机制debug过程中的各类报错try-except机制try-except-else-finally机制 在即将进入深度学习专题学习前&#xff0c;我们最后差缺补漏&#xff0c;把一些常见且重要的知识点给他们补上&#xff0c;加深对代码和流程的理解。…...

Jmeter变量传递介绍

文章目录 一、Jmeter变量类型及作用域二、变量传递方式1. 用户定义变量&#xff08;User Defined Variables&#xff09;2. CSV 数据文件&#xff08;CSV Data Set Config&#xff09;3.正则表达式提取器4.后置处理器&#xff08;Post Processor)4.1BeanShell/JSR223 后置处理器…...

机器学习 Day16 聚类算法 ,数据降维

聚类算法 1.简介 1.1 聚类概念 无监督学习&#xff1a;聚类是一种无监督学习算法&#xff0c;不需要预先标记的训练数据 相似性分组&#xff1a;根据样本之间的相似性自动将样本归到不同类别 相似度度量&#xff1a;常用欧式距离作为相似度计算方法 1.2 聚类vs分类 聚类&…...

白日梦:一个方便快捷的将故事制作成视频的工具

我有故事&#xff0c;但我想把它制作成视频&#xff0c;有没有什么好用的工具可以使用呢&#xff1f;如果你也被类似的问题困扰&#xff0c;那么今天分享的这个工具将会解决这个问题。从需求来看&#xff0c;我们希望的是纯文本的故事输入&#xff0c;完整的故事视频输出&#…...

ultralytics中tasks.py---parse_model函数解析

一、根据scale获取对应的深度、宽度和最大通道数 具体例如yaml文件内容如下: depth=0.33,那么重复的模块例如C2f原本重复次数是3,6,6,3,那么T对应的模型重复次数就是三分之一即1,1,2,1次。这个在后面定义的: width=0.25,max_channels=1024 原本c2=64,但经过make_div…...

Codeforces Round 1003 (Div. 4)

A. Skibidus and Amog’u 题目大意 给你一个字符串&#xff0c;把末尾的us换成i 解题思路 删掉最后两个加上“i”即可 代码实现 #include <bits/stdc.h>using i64 long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int …...

基于RFSOC ZU28DR+DSP 6U VPX处理板

板卡概述 基于RFSOC ZU28DRDSP 6U VPX处理板&#xff0c;是一款基于6U VPX总线架构的高速信号处理平台&#xff0c;数模混合信号处理卡&#xff0c;采用 Xilinx ZYNQ UltraScale RFSoC ZU28DR和TI DSP TMS320C6678组合设计&#xff0c;两者之间通过4x 5G SRIO互联。本板卡可实…...

C# 通过脚本实现接口

以前C#脚本用的委托注入模式&#xff0c;今天在AI提示下&#xff0c;尝试用脚本直接实现接口&#xff0c;然后C#可以动态或指定新类型创建接口实现对象。从代码角度看&#xff0c;稍显复杂&#xff0c;但脚本方面显得更简洁和有条理。 引用包需要Microsoft.CodeAnalysis、Micro…...

代码随想录算法训练营Day58

力扣695.岛屿的最大面积【medium】 力扣827.最大人工岛【hard】 一、力扣695.岛屿的最大面积【medium】 题目链接&#xff1a;力扣695.岛屿的最大面积 视频链接&#xff1a;代码随想录 1、思路 和岛屿数量那道题很像&#xff0c;只是递归这边要多一个怎么计算面积&#xff0c…...

若依框架页面

1.页面地址 若依管理系统 2.账号和密码 管理员 账号admin 密码admin123 运维 账号yuwei 密码123456 自己搭建的地址方便大家学习&#xff0c;不要攻击哦&#xff0c;谢谢啊...

redis 缓存穿透,缓存击穿,缓存雪崩

一&#xff1a;什么是缓存 &#xff08;1&#xff09;计算机&#xff1a;cpu、内存、磁盘&#xff0c;cpu任何需要的数据都要从内容中读入数据放入cpu,从cup内部添加一个缓存 &#xff08;2&#xff09;web开发的每个阶段都可以添加缓存 &#xff08;3&#xff09;缓存优缺点&a…...

ORACLE查看归档是否打开

一、使用V$DATABASE视图 SELECT log_mode FROM v$database; 结果说明&#xff1a; ARCHIVELOG - 数据库处于归档模式 NOARCHIVELOG - 数据库处于非归档模式 二、 使用v$instance视图 SELECT archiver FROM v$instance; 结果说明&#xff1a; STARTED - 归档进程已启动(归档模…...

Python环境管理工具深度指南:pip、Poetry、uv、Conda

Python环境管理工具深度指南&#xff1a;pip、Poetry、uv、Conda Python开发中&#xff0c;环境管理和依赖管理是不可避开的重要话题。合理地管理项目的Python环境&#xff08;尤其是虚拟环境&#xff09;有助于隔离不同项目的依赖&#xff0c;避免版本冲突&#xff0c;并确保…...

高等数学第七章---微分方程(§7.4-§7.5可降阶的高阶微分方程、二阶线性微分方程)

7.4 可降阶的高阶微分方程 某些类型的高阶微分方程可以通过适当的变量代换&#xff0c;将其阶数降低&#xff0c;从而化为阶数较低的方程进行求解。 一、 y ( n ) f ( x ) y^{(n)}f(x) y(n)f(x) 型方程 特征&#xff1a;方程的左端是 y y y 的 n n n 阶导数&#xff0c;右…...

Jmeter对服务端进行压测快速上手

安装 下载 安装jmeter的之前必须先装有JDK 官网下载地址&#xff1a;https://archive.apache.org/dist/jmeter/binaries/ jmeter3.0的对应jdk1.7&#xff0c;jmeter4.0对应jdk1.8以上&#xff0c;否者启用jmeter也会报错 配置 配置环境变量 在系统变量PATH上加上: %JMET…...

【嵌入模型与向量数据库】

目录 一、什么是向量&#xff1f; 二、为什么需要向量数据库&#xff1f; 三、向量数据库的特点 四、常见的向量数据库产品 FAISS 支持的索引类型 vs 相似度 五、常见向量相似度方法对比 六、应该用哪种 七、向量数据库的核心逻辑 &#x1f50d; 示例任务&#xff1a;…...

鸿蒙OSUniApp 开发实时聊天页面的最佳实践与实现#三方框架 #Uniapp

使用 UniApp 开发实时聊天页面的最佳实践与实现 在移动应用开发领域&#xff0c;实时聊天功能已经成为许多应用不可或缺的组成部分。本文将深入探讨如何使用 UniApp 框架开发一个功能完善的实时聊天页面&#xff0c;从布局设计到核心逻辑实现&#xff0c;带领大家一步步打造专…...

React构建组件

React构建组件 React 组件构建方式详解 React 组件的构建方式随着版本迭代不断演进&#xff0c;目前主要有 函数组件 和 类组件 两种核心模式&#xff0c;并衍生出多种高级组件设计模式。以下是完整的构建方式指南&#xff1a; 文章目录 React构建组件React 组件构建方式详解…...

auto.js面试题及答案

以下是常见的 Auto.js 面试题及参考答案&#xff0c;涵盖基础知识、脚本编写、运行机制、权限、安全等方面&#xff0c;适合开发岗位的技术面试准备&#xff1a; 一、基础类问题 什么是 Auto.js&#xff1f;它的主要用途是什么&#xff1f; 答案&#xff1a; Auto.js 是一个…...

OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南

&#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680; &#x1f4d1; 目录 &#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680;一、前言 &#x1f3af;二、系统…...

【springcloud学习(dalston.sr1)】Ribbon负载均衡(七)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; &#xff08;一&#xff09;Ribbon 负载均衡的理解 ribbon是一种客户端的负载均衡。类似于比如我们在火车站窗口…...

编程题 03-树1 树的同构【PAT】

文章目录 题目输入格式输出格式输入样例1&#xff08;对应图一&#xff09;输出样例1输入样例2&#xff08;对应图二&#xff09;输出样例2 题解解题思路完整代码 编程练习题目集目录 题目 给定两棵树 T 1 T_1 T1​ 和 T 2 T_2 T2​ 。如果 T 1 T_1 T1​ 可以通过若干次左右…...

团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级

光照、材质与交互效果的精细控制&#xff0c;通常意味着复杂的技术挑战&#xff0c;但借助 Shader Graph 14.1.0(已内置在团结引擎官方 1.5.0 版本中)&#xff0c;这一切都变得简单易用。通过最新团结引擎官方车模 Sample&#xff0c;开发者能切身感受到全新光照优化与编辑功能…...

Chrome安装最新vue-devtool插件

本vue-devtool版本是官方的 v7.6.8版本&#xff0c;兼容性好、功能齐全且稳定。 操作步骤&#xff1a; 方法一&#xff1a; 打开谷歌浏览器 --> 右上角三个点 --> 扩展程序 --> 管理扩展程序 --> 加载已解压的扩展程序&#xff0c; 然后选择解压后的文件夹即可。…...

鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp

使用UniApp打造多功能图表展示组件 在当前移动应用开发领域&#xff0c;数据可视化已成为不可或缺的一部分。无论是展示销售数据、用户增长趋势还是其他业务指标&#xff0c;一个优秀的图表组件都能有效提升用户体验。UniApp作为一款跨平台开发框架&#xff0c;如何在其中实现…...

海量数据Top k 与查重问题

海量数据求top k 问题&#xff1a; - 求最大的前k个元素、求最小的前k个元素 - 求最大的第k个元素、求最小的第k个元素 解法&#xff1a; - 大根堆、小跟堆 -》 优先级队列&#xff08;priority_queue&#xff09; - 快速分割函数 priority_queue<int,vector<int>…...

Beats

Beats是一个开放源代码的数据发送器。我们可以把Beats作为一种代理安装在我 们的服务器上&#xff0c;这样就可以比较方便地将数据发送到Elasticsearch或者Logstash 中。Elastic Stack提供了多种类型的Beats组件。 Beats可以直接将数据发送到Elasticsearch或者发送到Logstash&a…...

微型PCB打样厂家选型指南

智能手机、可穿戴设备、医疗电子等高精尖领域&#xff0c;微型PCB&#xff08;印制电路板&#xff09;如同设备的“神经中枢”&#xff0c;承载着信号传输、电源分配、元件互联等核心功能。其设计精度与制造质量直接决定了产品的性能上限与可靠性。而打样环节&#xff0c;则是从…...

ISP有感自发

一、黑电平 由于传感器&#xff0c;即便在无光的情况下&#xff0c;依然会产生微小的暗电流&#xff0c;这些暗电流可能是噪点会影响后期的调试。因此&#xff0c;我们便将这些电流处理为0&#xff0c;成为纯黑的颜色。可以在源头消除这些误差。 如何矫正黑电平&#xff1a; …...

编程技能:字符串函数04,直接使用 strcpy,解决报错

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数03&#xff0c;strncpy 回到目录…...

网络编程超时检测,unix域套接字,粘包

刷题&#xff1a; # 超时检测核心要点## 1. 基本类型### 阻塞模式- 永久等待数据&#xff0c;无超时机制- 典型函数&#xff1a;recv()阻塞调用### 非阻塞模式- 立即返回结果&#xff08;成功/错误&#xff09;- 设置方式&#xff1a;fcntl(fd, F_SETFL, O_NONBLOCK)### 超时检…...

springboot AOP 接口限流(基于IP的接口限流和黑白名单)

使用 Spring Boot 自定义注解和AOP实现基于IP的接口限流和黑白名单 在我们日常开发的项目中为了保证系统的稳定性&#xff0c;很多时候我们需要对系统做限流处理&#xff0c;它可以有效防止恶意请求对系统造成过载。常见的限流方案主要有&#xff1a; 网关限流&#xff1a; NG…...

Python uv包管理器使用指南:从入门到精通

Python uv包管理器使用指南&#xff1a;从入门到精通 作为一名Python开发者&#xff0c;你是否曾经为虚拟环境管理和依赖包安装而头疼&#xff1f;今天我要向大家介绍一个强大的工具——uv包管理器&#xff0c;它将彻底改变你的Python开发体验。 什么是uv包管理器&#xff1f…...