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

Swift观察机制新突破:如何用AsyncSequence实现原子化数据监听?

在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • **摘要**
    • **引言**
    • **什么是事务性观察?**
      • **现有观察机制的局限性**
      • **事务性观察的优势**
    • **代码示例**
      • **定义可观察对象**
      • **监听变更(事务性观察)**
      • **运行结果**
    • **实际应用场景**
      • **状态同步(前端 + 后端)**
      • **撤销/重做功能**
    • **常见问题(QA)**
      • **Q1:事务性观察和传统 `didSet` 有什么区别?**
      • **Q2:如果我只想监听单个属性,能优化性能吗?**
      • **Q3:这个方案是否适用于跨线程观察?**
    • **总结**
    • **6. 未来展望**
    • **参考资料**

摘要

本文介绍了一种在 Swift 中实现 事务性观察(Transactional Observation) 的新方法,它扩展了现有的观察机制,使其不仅适用于 SwiftUI,还能在更广泛的场景中使用。通过结合 AsyncSequence 和 Swift 并发模型,我们能够以更安全、更符合现代 Swift 编程风格的方式监听对象的变化。

引言

Swift 的观察系统(如 @ObservedObjectStateObject)在 SwiftUI 中表现良好,但在非 UI 场景(如后台数据处理、服务端逻辑)中,仍然缺乏一种高效且符合 Swift 并发模型的方式。

本方案提出了一种 基于事务的观察机制,它会在对象状态达到一致性时才发送变更事件,并通过 AsyncSequence 提供数据流,使其能无缝集成到 async/await 代码中。

什么是事务性观察?

事务性观察的核心思想是 将一系列相关的变化合并成一个逻辑单元,确保观察者不会收到中间的不一致状态。

现有观察机制的局限性

  • 即时触发:传统的观察(如 didSet)会在每次赋值时立即通知,可能导致观察者看到不一致的状态。
  • 缺乏组合性:难以在异步环境中使用,通常依赖闭包回调,代码可读性较差。

事务性观察的优势

  • 原子性更新:只有当所有相关属性变更完成时,才触发观察事件。
  • 异步友好:通过 AsyncSequence 提供变更流,支持 for await 循环,避免回调地狱。
  • 通用性强:不仅适用于 SwiftUI,也可用于服务端、数据库同步等场景。

代码示例

定义可观察对象

import Observation@Observable
class User {var name: String = "Alice"var age: Int = 30
}

监听变更(事务性观察)

let user = User()Task {for await (oldValue, newValue) in user.transactionValues(\.name) {print("名字从 \(oldValue) 变成了 \(newValue)")}
}// 修改数据
user.name = "Bob"  // 不会立即触发打印
user.age = 31      // 直到所有变更完成,才发送最终值

运行结果

名字从 Alice 变成了 Bob

(注意:由于事务性观察的原子性,nameage 的变更会被合并,仅在最外层修改完成后才通知观察者。)

实际应用场景

状态同步(前端 + 后端)

假设我们有一个用户管理系统,前端修改数据后需要同步到服务器。使用事务性观察,可以确保 仅在所有本地变更完成后才发送网络请求,避免多次无效同步。

Task {for await _ in user.transactionValues() {await api.updateUser(user)  // 仅在数据稳定时提交}
}

撤销/重做功能

在支持撤销操作的编辑器里,事务性观察可以 将多个编辑动作合并成一个事务,使得撤销时能回滚整个操作组,而不是零散的单个改动。

常见问题(QA)

Q1:事务性观察和传统 didSet 有什么区别?

  • didSet即时触发 的,而事务性观察会 等待所有相关变更完成 后才通知观察者。
  • 事务性观察支持 AsyncSequence,可以更方便地在并发代码中使用。

Q2:如果我只想监听单个属性,能优化性能吗?

可以!transactionValues(\.property) 允许指定要观察的属性,避免不必要的监听。

Q3:这个方案是否适用于跨线程观察?

是的,由于基于 Swift 结构化并发,它天生支持线程安全的数据流。

总结

  • 事务性观察提供了一种 更安全、更符合现代 Swift 编程风格 的监听机制。
  • 它通过 AsyncSequence 和 Swift 并发模型,让数据变更管理变得更直观。
  • 适用于 UI 状态管理、数据同步、撤销栈 等多种场景。

6. 未来展望

  • 探索与 SwiftData 的深度集成,优化数据库变更监听。
  • 支持自定义事务边界(如手动提交变更)。
  • 提供更细粒度的变更差异分析(如 oldValue vs newValue 的深度对比)。

参考资料

  • Swift Observation Proposal
  • Swift Concurrency: AsyncSequence Explained

相关文章:

Swift观察机制新突破:如何用AsyncSequence实现原子化数据监听?

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

Lombok库

文章目录 Lombok1.介绍2.主要注解2.1如何使用 Lombok2.1.1添加依赖2.1.2 使用Lombok注解2.1.3Lombok的其他常用注解ValueBuilderGoF23种设计模式之一:建造模式使用Builder注解自动生成建造模式的代码 SingularSlf4j使用选择合适的注解 Lombok 1.介绍 Lombok 是一个…...

算法思想之模拟

欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之模拟 发布时间:2025.4.14 隶属专栏:算法 目录 滑动窗口算法介绍核心特点常见问题优化方向 例题替换所有的问号题目链接题目描述算法思路代码实现 提莫攻击题目链接题目描述算法思路…...

Windows 系统如何使用Redis 服务

前言 在学习过程中,我们长期接触到的是Mysql 关系型数据库,也是够我们平时练习项目用的,但是后面肯定会有大型数据的访问就要借助新的新的工具。 一、什么是Redis Redis(Remote Dictionary Server)是一个基于内存的 键…...

2025年常见渗透测试面试题-红队面试宝典上(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、如何判断是否是域环境? 二、定位域控的 IP 三、定位域管所在机器 四、Kerberos 核心…...

Base64在线编码解码 - 加菲工具

Base64在线编码解码 - 加菲工具 打开网站 加菲工具 选择“Base64 在线编码解码” 或者直接打开https://www.orcc.top/tools/base64 输入需要编码/解码的内容,点击“编码”/“解码”按钮 编码: 解码: 复制已经编码/解码后的内容。...

前端面试宝典---闭包

闭包介绍 使用闭包: 在函数内声明一个变量,避免外部访问在该函数内再声明一个函数访问上述变量(闭包)返回函数内部的函数使用完毕建议闭包函数null;译放内存 function createCounter() {let count 0;return function () {coun…...

算法:有一个整数数组,长度为n。她希望通过一系列操作将数组变成一个回文数组。

小红有一个整数数组,长度为n。她希望通过一系列操作将数组变成一个回文数组。每次操作可以选择数组中任意两个相邻的元素 ai和 ai1,将它们的值同时加一。请你计算至少需要多少次操作使得数组变成一个回文数组。如果不可能,则输出-1。否则输出…...

数字人:开启医疗领域的智慧变革新时代(5/10)

摘要:数字人技术作为医疗变革的基石,通过多学科融合实现虚拟医生、手术模拟、医学教育等多元应用,贯穿诊前、术中、术后全流程,显著提升医疗效率、优化资源分配、推动个性化服务。尽管面临技术、伦理、数据安全等挑战,…...

正则表达式在线校验(RegExp) - 加菲工具

正则表达式在线校验 - 加菲工具 打开网站 加菲工具 选择“正则表达式在线校验” 或者直接打开https://www.orcc.top/tools/regexp 输入待校验的源文本与正则表达式,点击“校验”按钮 需要注意检验后的内容可能存在多空格,可以拉下去看看~...

某车企面试备忘

记录两个关于Binder的问题,我感觉面试官提的非常好,作一下备忘。 1.通过Binder进行的IPC(进程间通信)是线程阻塞的吗? 参考答案: Binder是Android平台的一种跨进程通信(IPC)机制&…...

从Ampere到Hopper:GPU架构演进对AI模型训练的颠覆性影响

一、GPU架构演进的底层逻辑 AI大模型训练效率的提升始终与GPU架构的迭代深度绑定。从Ampere到Hopper的演进路径中,英伟达通过‌张量核心升级‌、‌显存架构优化‌、‌计算范式革新‌三大技术路线,将LLM(大语言模型)训练效率提升至…...

【JavaEE】SpringBoot 统一功能处理

目录 一、拦截器1.1 使用1.1 定义拦截器1.2 注册配置拦截器 1.2 拦截器详解1.2.1 拦截路径1.2.2 拦截器执⾏流程 1.3 适配器模式 二、统一数据返回格式2.1 简单用法2.2 问题及解决 三、统一异常处理 一、拦截器 拦截器:拦截器是Spring框架提供的核⼼功能之⼀&#…...

杨辉三角(力扣 118)

118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] vector<vector<int>> generate(int numRows) { //生成有numRows个元素(vector<in…...

三周年创作纪念日

文章目录 回顾与收获三年收获的五个维度未来的展望致谢与呼唤 亲爱的社区朋友们&#xff0c;大家好&#xff01; 今天是 2025 年 4 月 14 日&#xff0c;距离我在 2022 年 4 月 14 日发布第一篇技术博客《SonarQube 部署》整整 1,095 天。在这条创作之路上&#xff0c;我既感慨…...

[c语言日记]轮转数组算法(力扣189)

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

【Unity笔记】Unity超时检测器开发:支持自定义重试次数与事件触发

在Unity游戏或应用开发中&#xff0c;我们经常会遇到需要检测超时的场景&#xff0c;比如&#xff1a; 等待用户在限定时间内完成某个交互&#xff1b;等待网络请求或资源加载是否在规定时间内返回&#xff1b;控制AI角色等待某个事件发生&#xff0c;超时后执行备选逻辑。 在…...

【微服务管理】注册中心:分布式系统的基石

在分布式系统日益普及的当下&#xff0c;如何高效地管理众多服务实例成为关键问题。注册中心应运而生&#xff0c;它犹如分布式系统的 “指挥中枢”&#xff0c;承担着服务注册、发现等核心任务&#xff0c;为整个系统的稳定运行和高效协作提供坚实保障。本文将深入探讨注册中心…...

P10413 [蓝桥杯 2023 国 A] 圆上的连线

题意&#xff1a; 给定一个圆&#xff0c;圆上有 n2023 个点从 1 到 n 依次编号。 问有多少种不同的连线方式&#xff0c;使得完全没有连线相交。当两个方案连线的数量不同或任何一个点连接的点在另一个方案中编号不同时&#xff0c;两个方案视为不同。 答案可能很大&#x…...

计算机操作系统——存储器管理

系列文章目录 1.存储器的层次结构 2.程序的装入和链接 3.连续分配存储管理方式&#xff08;内存够用&#xff09; 4.对换&#xff08;Swapping&#xff09;(内存不够用) 5.分页存储管理方式 6.分段存储管理方式 文章目录 系列文章目录前言一、存储器的存储结构寄存器&…...

TCPIP详解 卷1协议 四 地址解析协议

4.1——地址解析协议(ARP) 对于TCP/IP网络&#xff0c;地址解析协议&#xff08;ARP&#xff09;[RFC0826]提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射。ARP仅用于IPv4。IPv6使用邻居发现协议&#xff0c;它被合并入ICMPv6。当两个局域网的主机之间传输的以太…...

履带小车+六轴机械臂(2)

本次介绍原理图部分 开发板部分&#xff0c;电源供电部分&#xff0c;六路舵机&#xff0c;PS2手柄接收器&#xff0c;HC-05蓝牙模块&#xff0c;蜂鸣器&#xff0c;串口&#xff0c;TB6612电机驱动模块&#xff0c;LDO线性稳压电路&#xff0c;按键部分 1、开发板部分 需要注…...

耘想WinNAS:以聊天交互重构NAS生态,开启AI时代的存储革命

一、传统NAS的交互困境与范式瓶颈 在传统NAS&#xff08;网络附加存储&#xff09;领域&#xff0c;用户需通过复杂的图形界面或命令行工具完成文件管理、权限配置、数据检索等操作&#xff0c;学习成本高且效率低下。例如&#xff0c;用户若需搜索特定文件&#xff0c;需手动…...

如何通过自动化解决方案提升企业运营效率?

引言 在现代企业中&#xff0c;运营效率直接影响着企业的成本、速度与竞争力。尤其是随着科技的不断发展&#xff0c;传统手工操作和低效的流程逐渐无法满足企业的需求。自动化解决方案正成为企业提升运营效率、降低成本和提高生产力的关键。无论是大型跨国公司&#xff0c;还…...

【笔记ing】AI大模型-03深度学习基础理论

神经网络&#xff1a;A neural network is a network or circuit of neurons,or in a modern sense,an artificial neural network,composed of artificial neurons or nodes.神经网络是神经元的网络或回路&#xff0c;或者在现在意义上来说&#xff0c;是一个由人工神经元或节…...

Spring-注解编程

注解基础概念 1.什么是注解编程 指的是在类或者方法上加入特定的注解(XXX) 完成特定功能的开发 Component public classXXX{} 2.为什么要讲注解编程 1.注解开发方便 代码简洁 开发速度大大提高 2.Spring开发潮流 Spring2.x引入注解 Spring3.x完善注解 Springboot普及 推广注解…...

大数据学习栈记——MongoDB安装

本文介绍NoSQL技术&#xff1a;MongoDB的安装。操作系统&#xff1a;Ubuntu24.04 MongoDB介绍 MongoDB是一个基于分布式文件存储的数据库&#xff0c;由C语言编写&#xff0c;旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之…...

linux 系统编程基础部分 day1

常用指令 创建修改用户组 查看当前用户组&#xff1a;whoami 创建用户 sudo adduser 用户 sudo addgroup 组名 添加权限&#xff1a;chmod [u,g,o,a][x,w,r] 数字表示法r4 w2 x1 chmod 471 每个权限种类想加 给文件换所属用户 chown 新用户名 文件名 chgrp …...

访问不到服务器上启动的llamafactory-cli webui

采用SSH端口转发有效&#xff0c;在Windows上面进行访问 在服务器上启动 llamafactory-cli webui 后&#xff0c;访问方式需根据服务器类型和网络环境选择以下方案&#xff1a; 一、本地服务器&#xff08;物理机/虚拟机&#xff09; 1. 直接访问 若服务器与操作设备处于同一…...

论文阅读笔记——Generating Long Sequences with Sparse Transformers

Sparse Transformer 论文 解决了 Transformer 在长序列建模时的计算开销和内存过大的问题。 可视化了一个 128 层自注意力在 CIFAR-10 的数据集上学习到的注意力模式&#xff0c;发现&#xff1a;1&#xff09;稀疏性普遍存在&#xff1a;大多数层在多数数据点上表现出稀疏注意…...

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(旅游景区导游管理平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、制定项目章程二、制订项目管理计划三、指导和管理项目工作四、管理项目知识五、监控项目工作六、实施整体变更控制七、结束项目或阶段论文 在国家《中国旅游“十三五”发展规划信息化专项规划的背景下…...

C++ 用红黑树封装map/set

前言 一、源码结构分析 二、模拟实现map/set 2.1 套上KeyOfT 2.2 普通迭代器实现 2.3 const迭代器实现 2.4 解决key不能修改的问题 2.5 map的[]实现 2.6 map/set以及红黑树源码 2.6.1 RBTree.h 2.6.2 set.h 2.6.3 map.h 总结 前言 之前的文章讲解了红黑树的具体实…...

VirtualBox虚拟机与主机之间无法复制粘贴的问题

插入出现问题&#xff0c;需要把其他的dvd弹出&#xff0c;比如系统安装镜像。 https://www.cnblogs.com/jianmuzi/p/17788084.html...

【HDFS入门】HDFS核心组件Secondary NameNode角色职责与运行机制解析

目录 1 Secondary NameNode的角色定位与常见误解 2 核心职责详解 2.1 核心功能职责 2.2 与NameNode的协作关系 3 运行机制深度剖析 3.1 检查点触发机制 3.2 元数据合并流程 4 与Hadoop 2.0 HA架构的对比 5 配置调优指南 5.1 关键配置参数 5.2 性能优化建议 6 实践应…...

AI知识补全(十六):A2A - 谷歌开源的agent通信协议是什么?

名人说&#xff1a;一笑出门去&#xff0c;千里落花风。——辛弃疾《水调歌头我饮不须劝》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;AI知识补全&#xff08;十五&#xff09;&#xff1a;AI可解…...

OOM问题排查和解决

问题 java.lang.OutOfMemoryError: Java heap space 排查 排查手段 jmap命令 jmap -dump,formatb,file<file-path> <pid> 比如 jmap -dump:formatb,file./heap.hprof 44532 使用JVisualVM工具&#xff1a; JVisualVM是一个图形界面工具&#xff0c;它可以帮…...

黑马头条day01

1)课程对比 2)项目概述 2.1)能让你收获什么 2.2)项目课程大纲 2.3)项目概述 随着智能手机的普及&#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快&#xff0c;很多人只能利用碎片时间来获取信息&#xff0c;因此&#xff0c;对于移动资讯客户端的需求也越来越…...

关于IDEA中使用ctrl跳转源码出现???的解决方案

最近在学习大数据相关课程的时候使用ctrl查看源码时出现源码是问号的情况。写一篇博客来分享一下自己的解决方案&#xff1a; 但我使用ctrl查看源码的时候具体函数的细节使用???来代替&#xff0c;而且点击上方的Download按钮没有反应&#xff0c;这个时候我们需要手动指定…...

第三方API——Spring Boot 集成阿里云短信发送功能

目录 一. 创建阿里云OSS服务并获取密钥&#xff0c;开通短信服务 1.1 注册阿里云服务器 1.2 开通短信服务 1.3 创建对象存储OSS服务 1.4 RAM用户授权短信权限 1.5 新增用户并授权用户短信权限 1.6 获取 AccessKey ID 和 AccessKey Secret 二. 创建项目集成短信发送 2.1…...

【C++】前向声明(Forward Declaration)

前向声明&#xff08;Forward Declaration&#xff09;是在C、C等编程语言中&#xff0c;在使用一个类、结构体或其他类型之前&#xff0c;仅声明其名称而不给出完整定义的一种方式。 作用 减少编译依赖&#xff1a;当一个源文件包含大量头文件时&#xff0c;编译时间会显著增…...

Golang|抽奖相关

文章目录 抽奖核心算法生成抽奖大转盘抽奖接口实现 抽奖核心算法 我们可以根据 单商品库存量/总商品库存量 得到每个商品被抽中的概率&#xff0c;可以想象这样一条 0-1 的数轴&#xff0c;数轴上的每一段相当于一种商品&#xff0c;概率之和为1。 抽奖时&#xff0c;我们会生…...

10.第二阶段x64游戏实战-添加计时器

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;9.第二阶段x64游戏实战-创建项目代码获取人物属性 效果图&#xff1a; 当前游戏…...

fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb

fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb...

打造AI应用基础设施:Milvus向量数据库部署与运维

目录 打造AI应用基础设施&#xff1a;Milvus向量数据库部署与运维1. Milvus介绍1.1 什么是向量数据库&#xff1f;1.2 Milvus主要特点 2. Milvus部署方案对比2.1 Milvus Lite2.2 Milvus Standalone2.3 Milvus Distributed2.4 部署方案对比表 3. Milvus部署操作命令实战3.1 Milv…...

使用WindSurf生成贪吃蛇小游戏:从零开始的开发之旅

在当今数字化时代&#xff0c;编程已经成为一项必备技能&#xff0c;而创建游戏无疑是学习编程过程中最具趣味性的项目之一。今天&#xff0c;我将向大家介绍如何使用WindSurf这款强大的代码生成工具来快速生成一个经典的贪吃蛇小游戏。从下载软件到运行游戏&#xff0c;我们将…...

论文学习:《EVlncRNA-net:一种双通道深度学习方法,用于对实验验证的lncRNA进行准确预测》

原文标题&#xff1a;EVlncRNA-net: A dual-channel deep learning approach for accurate prediction of experimentally validated lncRNAs 原文链接&#xff1a;https://www.sciencedirect.com/science/article/pii/S0141813025020896 长链非编码RNA( long non-coding RNAs&…...

LLM Post-Training

1. LLM的后训练分类 Fine-tuning Reinforcement Learning Test-time Scaling 方法 优点 缺点 Fine-tuning 任务适应性&#xff1a;能够针对特定任务或领域进行优化&#xff0c;提升模型在该任务上的性能。 数据驱动优化&#xff1a;利用标注数据直接调整模型参数&#x…...

【LLM】解锁Agent协作:深入了解谷歌 A2A 协议与 Python 实现

人工智能&#xff08;AI&#xff09;智能体正迅速成为企业提高生产力、自动化工作流程和增强运营能力的关键工具。从处理日常重复性任务到协助复杂的决策&#xff0c;智能体的潜力巨大。然而&#xff0c;当这些智能体来自不同的供应商、使用不同的框架或被限制在孤立的数据系统…...

FileWriter 详细解析与记忆方法

FileWriter 详细解析与记忆方法 一、FileWriter 核心概念 FileWriter 是 Java 中用于向文件写入字符数据的类&#xff0c;继承自 OutputStreamWriter&#xff0c;属于字符流体系。 1. 核心特点 特性说明继承关系Writer → OutputStreamWriter → FileWriter数据单位字符&am…...

Java笔记5——面向对象(下)

目录 一、抽象类和接口 1-1、抽象类&#xff08;包含抽象方法的类&#xff09; 1-2、接口 ​编辑​编辑 二、多态 ​编辑 1. 自动类型转换&#xff08;向上转型&#xff09; 示例&#xff1a; 注意&#xff1a; 2. 强制类型转换&#xff08;向下转型&#xff09; 示…...