Java方法重写(Override)详解:从语法到多态实战
1. 背景与核心概念什么是“Override”在软件开发领域Override是一个极其核心且高频出现的概念中文常译为“重写”或“覆盖”。它并非指某个具体的舞蹈或文化作品而是面向对象编程OOP的基石之一。简单来说Override 允许子类重新定义即覆盖从父类继承来的方法从而提供更适合自身特性的实现。它解决了什么问题想象一个图形绘制程序有一个基类Shape形状它有一个draw()方法。对于Circle圆形和Rectangle矩形这两个子类来说绘制它们的逻辑完全不同。如果让Circle和Rectangle直接使用Shape的draw()方法假设它有默认实现显然无法正确绘制出各自的图形。Override 机制就是为了解决这种“通用接口不同实现”的问题而生的。它实现了多态性——同一个方法调用如shape.draw()根据对象实际类型的不同会执行不同的代码这是构建灵活、可扩展软件系统的关键。常见应用场景框架扩展在 Spring、Spring Boot 等框架中我们经常通过重写Bean配置方法、事件监听器方法或模板方法来自定义行为。接口实现实现接口时本质上就是重写接口中定义的所有抽象方法。自定义行为在业务开发中子类根据自身业务规则重写父类的计算逻辑、验证逻辑等。模板方法模式父类定义算法骨架子类重写其中的某些步骤。为什么需要掌握理解并熟练运用 Override是写出符合 OOP 设计原则如里氏替换原则代码的前提。它能帮助你构建出层次清晰、易于维护和扩展的代码结构是中级开发者向高级进阶的必备技能。混淆 Override 与 Overload重载或者错误地使用它会导致难以调试的运行时错误。2. 环境准备与版本说明本文将主要以Java语言为例来讲解 Override 的原理与实践因为 Java 的注解和语法规则使其成为一个非常清晰的教学案例。同时我们也会对比 Python 等语言中的类似机制。基础环境要求操作系统Windows 10/11, macOS, 或主流 Linux 发行版如 Ubuntu 22.04。Java 开发工具包 (JDK)版本 8 或以上推荐 JDK 11 或 17因为它们是长期支持版本。本文示例兼容 JDK 8。集成开发环境 (IDE)IntelliJ IDEA社区版或旗舰版、Eclipse 或 VS Code需安装 Java 扩展包。使用 IDE 可以更方便地识别Override注解并提供代码提示。构建工具Maven 或 Gradle可选用于管理依赖但本文核心示例无需额外依赖。示例项目结构我们将创建一个简单的 Maven 项目来演示。override-demo ├── pom.xml └── src └── main └── java └── com └── example └── demo ├── oop │ ├── Shape.java │ ├── Circle.java │ └── Rectangle.java └── Main.java关键版本说明Override注解在 JDK 1.5Java 5中被引入。在 JDK 1.5 之前重写方法完全依靠程序员自觉遵守命名和签名规则编译器无法提供有效检查容易出错。从 JDK 6 开始Override注解的适用范围被扩大不仅可以用于重写父类方法还可以用于实现接口方法。3. 核心语法、配置与原理拆解3.1 语法规则如何正确重写一个方法在 Java 中要重写一个方法必须遵循以下严格的规则这些规则是 Java 语言规范定义的编译器会强制检查方法签名必须相同方法名、参数列表参数的类型、顺序和数量必须与父类中被重写的方法完全一致。返回类型必须兼容在 Java 5 中重写方法的返回类型可以是父类方法返回类型的子类协变返回类型。这是为了提供更具体的类型。访问权限不能更严格重写方法的访问修饰符public, protected, default不能比父类方法的访问权限更严格。例如父类方法是protected子类重写时可以是public或protected但不能是private或default在非同一包时。不能重写 final 方法被final关键字修饰的方法不能被重写。不能重写 static 方法静态方法属于类不属于对象实例。子类可以定义一个与父类静态方法签名相同的方法但这叫“隐藏”Hiding不是重写。异常声明重写方法可以抛出与父类方法相同的异常或不抛出异常或抛出父类方法抛出异常的子类异常。但不能抛出新的、更宽泛的检查型异常Checked Exception。3.2Override注解编译器的好帮手Override是一个标记注解它本身不改变程序的运行时行为。它的核心价值在于让编译器帮你检查。用途明确告诉编译器“我打算重写父类的一个方法”。如果编译器发现父类中不存在签名匹配的方法或者你的重写违反了上述规则如访问权限更严格它就会立即报错而不是等到运行时才出现意料之外的行为。为什么必须用这是一个最佳实践可以避免因拼写错误、参数顺序错误或误解了父类方法签名而导致的“意外重载”而非“重写”。这种错误在运行时很难排查。// 文件路径src/main/java/com/example/demo/oop/Shape.java package com.example.demo.oop; public class Shape { // 父类方法 public double calculateArea() { System.out.println(计算Shape面积默认实现可能返回0); return 0.0; } public void draw() { System.out.println(绘制一个形状); } }// 文件路径src/main/java/com/example/demo/oop/Circle.java package com.example.demo.oop; public class Circle extends Shape { private double radius; public Circle(double radius) { this.radius radius; } // 正确使用 Override 注解重写 calculateArea 方法 Override public double calculateArea() { return Math.PI * radius * radius; } // 正确使用 Override 注解重写 draw 方法 Override public void draw() { System.out.println(绘制一个半径为 radius 的圆形); } // 一个常见的错误示例本意是重写但写错了方法名 // Override // 如果加上这行编译器会报错Method does not override method from its superclass public double calculateArea(double factor) { // 这实际上是重载(Overload)因为参数列表不同 return Math.PI * radius * radius * factor; } }3.3 重写(Override) vs. 重载(Overload)核心区别这是初学者最容易混淆的一对概念。它们的区别是面试和代码审查中的常客。特性重写 (Override)重载 (Overload)发生位置父子类之间同一个类内部或父子类间但意义不同方法签名必须完全相同除协变返回类型必须不同参数类型、个数、顺序至少一项不同返回类型必须相同或是其子类协变可以不同访问修饰符不能比父类更严格可以不同异常声明有限制不能更宽可以不同调用时机运行时根据对象实际类型决定动态绑定编译时根据参数类型决定静态绑定核心目的实现多态提供特定实现提供处理不同类型数据的同名方法提高可读性// 文件路径src/main/java/com/example/demo/oop/OverloadDemo.java package com.example.demo.oop; public class OverloadDemo { // 重载示例在同一个类中 public int add(int a, int b) { return a b; } // 重载参数个数不同 public int add(int a, int b, int c) { return a b c; } // 重载参数类型不同 public double add(double a, double b) { return a b; } // 这不是重载会编译错误方法签名重复 // public double add(int a, int b) { return (double)(a b); } }4. 完整实战案例构建一个简单的图形系统让我们通过一个完整的、可运行的例子来巩固 Override 和多态的概念。4.1 创建项目结构与父类首先创建 Maven 项目并定义基础的Shape类。!-- 文件路径pom.xml -- ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdoverride-demo/artifactId version1.0-SNAPSHOT/version properties maven.compiler.source11/maven.compiler.source maven.compiler.target11/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties /projectShape.java代码见上一节 3.2。4.2 创建子类并重写方法创建Circle和Rectangle类它们继承Shape并重写其方法。// 文件路径src/main/java/com/example/demo/oop/Rectangle.java package com.example.demo.oop; public class Rectangle extends Shape { private double width; private double height; public Rectangle(double width, double height) { this.width width; this.height height; } Override public double calculateArea() { return width * height; } Override public void draw() { System.out.println(绘制一个 width x height 的矩形); } }Circle.java代码见上一节 3.2。4.3 编写主程序体验多态创建一个Main类演示如何通过父类引用调用子类重写的方法。// 文件路径src/main/java/com/example/demo/Main.java package com.example.demo; import com.example.demo.oop.Circle; import com.example.demo.oop.Rectangle; import com.example.demo.oop.Shape; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // 1. 创建具体子类对象 Circle circle new Circle(5.0); Rectangle rectangle new Rectangle(4.0, 6.0); // 2. 直接调用子类方法 System.out.println(圆的面积: circle.calculateArea()); circle.draw(); System.out.println(\n矩形的面积: rectangle.calculateArea()); rectangle.draw(); // 3. 多态的威力使用父类类型引用子类对象 System.out.println(\n 使用多态进行统一处理 ); ListShape shapes new ArrayList(); shapes.add(new Circle(3.0)); shapes.add(new Rectangle(2.0, 5.0)); shapes.add(new Circle(7.0)); for (Shape shape : shapes) { // 此处调用的 calculateArea 和 draw 方法 // 会在运行时根据 shape 实际指向的对象类型Circle 或 Rectangle来决定。 // 这是 Override 实现的动态绑定。 double area shape.calculateArea(); shape.draw(); System.out.println(计算得到的面积: area \n); } // 4. 演示类型转换与 instanceof 检查 System.out.println(\n 类型检查与转换 ); Shape unknownShape shapes.get(0); // 实际上是一个 Circle if (unknownShape instanceof Circle) { Circle c (Circle) unknownShape; // 安全的向下转型 System.out.println(这是一个圆形可以调用圆形特有的方法如果有的话。); // 例如如果 Circle 有一个 getRadius() 方法这里就可以调用。 } } }4.4 运行与验证在 IDE 中直接运行Main类的main方法或在项目根目录下使用 Maven 命令编译运行mvn clean compile exec:java -Dexec.mainClasscom.example.demo.Main预期输出圆的面积: 78.53981633974483 绘制一个半径为 5.0 的圆形 矩形的面积: 24.0 绘制一个 4.0x6.0 的矩形 使用多态进行统一处理 绘制一个半径为 3.0 的圆形 计算得到的面积: 28.274333882308138 绘制一个 2.0x5.0 的矩形 计算得到的面积: 10.0 绘制一个半径为 7.0 的圆形 计算得到的面积: 153.93804002589985 类型检查与转换 这是一个圆形可以调用圆形特有的方法如果有的话。4.5 结果说明从输出可以看到子类对象circle,rectangle成功调用了自己重写的calculateArea和draw方法。当我们将Circle和Rectangle对象放入ListShape后通过Shape类型的引用shape调用方法程序自动、正确地调用了各自子类的方法。这就是运行时多态是 Override 机制带来的核心价值。它允许我们编写通用的、处理“形状”的代码而无需关心具体是哪种形状极大地提高了代码的扩展性和可维护性。如果要新增一个Triangle类只需让其继承Shape并重写方法主循环的代码一行都不用改。5. 常见问题与排查思路在实践 Override 时你可能会遇到以下典型问题。问题现象常见原因解决思路编译错误Method does not override a method from its superclass1. 方法签名名称、参数与父类方法不匹配。2. 试图重写private、final或static方法。3. 父类方法在更高版本的 JDK 中才存在当前编译环境版本较低。1. 仔细核对父类方法的签名包括参数顺序和类型。2. 检查父类方法定义确认其可重写性。3. 确认 JDK 版本或检查是否导入了正确的类。运行时行为不符合预期没有调用子类方法1. 子类方法没有正确重写可能是重载了。2. 对象引用类型是父类但实际对象也是父类没有多态。3. 重写的是静态方法实际是隐藏不是重写。1. 为子类方法添加Override注解让编译器检查。2. 确认new创建的是子类对象。3. 区分静态方法和实例方法静态方法调用看左边引用类型。Override注解在接口方法上报错JDK 1.5在 JDK 1.5 中Override不能用于标注接口方法的实现。升级到 JDK 1.6 或更高版本或者移除该注解不推荐失去编译检查。重写方法时访问权限编译错误子类重写方法的访问修饰符比父类更严格如父类public子类改为protected。将子类方法的访问权限改为与父类相同或更宽松。关于异常声明的编译错误子类重写方法抛出了新的、比父类方法更宽泛的检查型异常。1. 在子类方法中不抛出该异常改用 try-catch 处理。2. 或抛出父类异常的子类异常。3. 或抛出非检查型异常RuntimeException。排查清单编译期始终使用Override注解。签名核对方法名、参数类型/数量/顺序、返回类型协变检查是否完全匹配权限检查子类方法访问权限是否 父类方法方法性质父类方法是否是final/static/private异常检查子类抛出的检查型异常是否合法运行时确认对象创建语句 (new) 实例化的是子类。集合与多态使用父类类型集合如ListShape时添加的是否是子类对象6. 最佳实践与工程建议掌握语法只是第一步在工程中正确、优雅地使用 Override 更为重要。始终使用Override注解理由这是最重要的实践。它让意图清晰并让编译器成为你的第一道防线避免低级错误。即使是实现接口方法在 JDK 6 中也应使用。遵守里氏替换原则 (LSP)核心子类对象必须能够替换掉父类对象且程序的行为不变。这意味着重写不应改变方法的“契约”。实践不要改变父类方法的核心语义。例如父类save()方法是保存到数据库子类重写后不应改为删除数据。子类方法的前置条件对输入的要求不能强于父类。子类方法的后置条件对输出的承诺不能弱于父类。子类方法不应抛出父类方法未声明的新的检查型异常。谨慎使用super关键字在重写方法中可以通过super.methodName()调用父类的原始实现。这常用于“扩展”而非“完全替换”父类行为。典型场景模板方法模式、需要在父类逻辑前后添加额外操作如日志、鉴权。Override public void draw() { // 1. 执行子类自己的前置逻辑 System.out.println(开始绘制...); // 2. 调用父类核心绘制逻辑如果父类有默认实现 super.draw(); // 3. 执行子类自己的后置逻辑 System.out.println(绘制完成。); }避免在构造方法中调用可重写的方法原因在父类构造器执行时子类的字段可能还未初始化因为子类构造器在父类之后执行。如果父类构造器调用了被子类重写的方法该方法访问的子类字段可能是默认值如null或0导致难以发现的 bug。public abstract class Base { public Base() { // 危险调用了一个抽象或可重写的方法 initialize(); } protected abstract void initialize(); } public class Derived extends Base { private String data; public Derived(String value) { // super() 被隐式调用此时父类构造器已运行 this.data value; } Override protected void initialize() { System.out.println(Data is: data); // 输出 null因为 data 还未被赋值 } }为继承而设计否则禁止继承如果某个类不是专门为了被继承而设计应将其声明为final以防止他人随意继承和重写破坏类的内部不变性。如果类允许继承应清晰地文档化哪些方法可以重写、重写时有何约定。对于不希望被重写的方法使用final修饰。在框架中的使用如 Spring在 Spring 中重写Bean方法、ApplicationListener接口方法等非常常见。务必阅读框架文档了解重写时的上下文如 Bean 的生命周期并通常需要调用super方法以保留框架的默认行为。7. 总结与学习路线通过本文我们系统地剖析了 Java 中 Override重写的核心机制。我们从其解决多态性的根本目的出发详细讲解了必须遵守的语法规则、Override注解的编译期保障价值并通过一个完整的图形系统实战案例让你亲身体验了“同一接口不同实现”的威力。我们还梳理了重写与重载的关键区别提供了常见问题的排查清单并给出了在大型工程中安全、有效使用重写的最佳实践。关键点回顾Override 是实现运行时多态的基石它依赖于继承关系。Override注解是必须的它能将潜在的错误暴露在编译阶段。严格遵循方法签名、访问权限和异常声明规则是正确重写的前提。理解多态父类引用指向子类对象时调用重写方法执行的是子类的逻辑。遵循里氏替换原则保证重写行为是“增强”而非“破坏”。下一步学习路线深入 OOP学习其他两大特性封装和继承并理解抽象类与接口的异同。设计模式研究严重依赖重写和多态的模式如模板方法模式、策略模式、工厂方法模式。这些模式是 Override 的高级应用场景。Java 进阶了解invokedynamic与动态方法分派Method Dispatch的 JVM 底层原理理解静态绑定与动态绑定的区别。其他语言对比学习 Python 中的方法重写同样支持但无Override注解、C 中的virtual关键字和重写加深对概念通用性的理解。框架应用在 Spring、MyBatis 等主流框架的源码中寻找大量使用 Override 的实例学习其设计思路。掌握 Override 绝非死记硬背语法而是在理解其设计意图的基础上将其转化为构建灵活、健壮软件系统的有力工具。建议你立即动手将文中的示例代码敲一遍并尝试添加一个新的Triangle形状类体会扩展系统的便捷性。在实际项目中每当你要重写一个方法时先问自己三个问题我的重写是否遵守了 LSP我加上Override注解了吗我是否需要调用super养成这三个习惯你的代码质量将显著提升。

相关新闻

DeepSeek-V4-Flash API 实战指南:高性价比大模型接入与工程实践

DeepSeek-V4-Flash API 实战指南:高性价比大模型接入与工程实践

最近在对接大模型 API 时,你是否也感受到了成本与性能难以兼得的痛点?无论是 OpenAI、Claude 还是国内其他模型,高昂的调用费用常常让个人开发者和初创团队望而却步。DeepSeek 最新推出的DeepSeek-V4-Flash 正式版 API或许是一个极具吸引力的…

2026/8/5 1:56:52 阅读更多 →
CV模型上线即崩?AI学计算机视觉的5个隐形陷阱(含TensorRT量化失效日志解码+热修复补丁)

CV模型上线即崩?AI学计算机视觉的5个隐形陷阱(含TensorRT量化失效日志解码+热修复补丁)

更多请点击: https://intelliparadigm.com 第一章:CV模型上线即崩?AI学计算机视觉的5个隐形陷阱(含TensorRT量化失效日志解码热修复补丁) 部署一个在PyTorch上准确率98%的ResNet-50分类模型到边缘设备后,推…

2026/8/5 1:56:52 阅读更多 →
GeekIt V2.2.0 重磅更新:22个新工具上线,这次真的能救命

GeekIt V2.2.0 重磅更新:22个新工具上线,这次真的能救命

大家好,我是 GeekIt 的作者。 距离上次更新已经过去快一周了,这段时间我基本没怎么睡觉。不是因为焦虑,而是因为兴奋——每天都有新的想法冒出来,每天都在想"这个工具一定要做"。 今天,V2.2.0 正式发布。 说…

2026/8/5 1:56:52 阅读更多 →

最新新闻

揭秘建设网站用的软件:从小白到专家的完整攻略与避坑指南

揭秘建设网站用的软件:从小白到专家的完整攻略与避坑指南

说实话,以前我觉得搞网站那是程序员的事,跟我这种普通小老板或者自媒体人有什么关系?那时候我觉得网站这东西,要么花钱找外面公司做,要么自己啃那些像天书一样的代码,想想都头大。但是,随着这两年互联网环境的变迁,尤其是现在大家越来越重视个人IP,越来越重视私域流量…

2026/8/6 7:54:39 阅读更多 →
前端性能优化:visibilitychange事件实现页面智能资源调度

前端性能优化:visibilitychange事件实现页面智能资源调度

1. 从一次“幽灵请求”说起:为什么我们需要知道页面是否被看见? 去年我接手一个后台数据大屏项目,客户反馈说:“你们的系统是不是有BUG?我们晚上下班后没人操作,但监控显示API调用量还是很高,流…

2026/8/6 7:54:39 阅读更多 →
OpenClaw:从零部署AI自治智能体,实现自动化工作流

OpenClaw:从零部署AI自治智能体,实现自动化工作流

1. 项目概述:OpenClaw,一个正在改变游戏规则的AI自治体最近在开发者圈子里,OpenClaw这个名字的热度有点压不住了。如果你关注GitHub趋势或者一些前沿的AI社区,大概率已经看到过它。简单来说,OpenClaw是一个开源的、高度…

2026/8/6 7:54:39 阅读更多 →
Godot物理游戏开发:阻尼振荡器与可破坏地形的实现与优化

Godot物理游戏开发:阻尼振荡器与可破坏地形的实现与优化

1. 项目概述与核心思路最近在做一个物理模拟向的小游戏原型,核心玩法是玩家操控一个带有物理属性的“振荡器”去破坏地形。这个想法源于几年前玩《坎巴拉太空计划》时,对飞船着陆时起落架的阻尼缓冲效果特别着迷,后来在《围攻》这类物理沙盒游…

2026/8/6 7:54:39 阅读更多 →
中小电商AI客服部署避坑指南:从SaaS到私有化,快速上手指南

中小电商AI客服部署避坑指南:从SaaS到私有化,快速上手指南

1. 项目缘起:为什么中小电商的AI客服部署总在“踩坑”?最近和几个做电商的朋友聊天,从淘宝、京东到抖音小店,大家不约而同地都在琢磨同一件事:怎么把AI客服机器人给用起来。想法都很美好——24小时在线、秒回客户、降低…

2026/8/6 7:54:39 阅读更多 →
Java判空最佳实践:告别!=null的代码习惯

Java判空最佳实践:告别!=null的代码习惯

1. 为什么我们总是习惯性写 !null 在Java开发中,null检查就像空气一样无处不在。几乎每个有一定经验的Java开发者都写过这样的代码: if (object ! null) {// 业务逻辑 }这种写法如此普遍,以至于我们很少思考它的问题。但事实上,…

2026/8/6 7:53:39 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →