Java中的多态与继承
Java中的多态与继承
开始学习Java中的多态及如何在多态方法调用中进行方法调用
多态——即对象根据其类型执行特定操作的能力——是Java代码灵活性的核心。四人组(Gang Of Four)创建的许多设计模式都依赖于某种形式的多态,包括命令模式。本文将介绍Java多态的基础知识及如何在程序中使用它。
关于Java多态需要了解的内容
- 多态与Java继承
- 为何多态重要
- 方法重写中的多态
- 核心Java类中的多态
- 多态方法调用与类型转换
- 保留关键字与多态
- 多态的常见错误
- 关于多态需要记住的要点
多态与Java继承
我们将重点探讨多态与Java继承的关系。需记住的核心点是:多态需要继承或接口实现。以下示例通过Duke和Juggy展示这一点:
public abstract class JavaMascot {public abstract void executeAction();
}public class Duke extends JavaMascot {@Overridepublic void executeAction() {System.out.println("Punch!");}
}public class Juggy extends JavaMascot {@Overridepublic void executeAction() {System.out.println("Fly!");}
}public class JavaMascotTest {public static void main(String... args) {JavaMascot dukeMascot = new Duke();JavaMascot juggyMascot = new Juggy();dukeMascot.executeAction();juggyMascot.executeAction();}
}
代码输出为:
Punch!
Fly!
由于各自的具体实现,Duke和Juggy的动作均被执行。
为何多态重要
使用多态的目的是将客户端类与实现代码解耦。客户端类通过接收具体实现来执行所需操作,而非硬编码。这种方式下,客户端类仅需了解执行操作的必要信息,这是松耦合的典范。
为了更好地理解多态的优势,请观察以下SweetCreator
:
public abstract class SweetProducer {public abstract void produceSweet();
}public class CakeProducer extends SweetProducer {@Overridepublic void produceSweet() {System.out.println("Cake produced");}
}public class ChocolateProducer extends SweetProducer {@Overridepublic void produceSweet() {System.out.println("Chocolate produced");}
}public class CookieProducer extends SweetProducer {@Overridepublic void produceSweet() {System.out.println("Cookie produced");}
}public class SweetCreator {private List<SweetProducer> sweetProducer;public SweetCreator(List<SweetProducer> sweetProducer) {this.sweetProducer = sweetProducer;}public void createSweets() {sweetProducer.forEach(sweet -> sweet.produceSweet());}
}public class SweetCreatorTest {public static void main(String... args) {SweetCreator sweetCreator = new SweetCreator(Arrays.asList(new CakeProducer(),new ChocolateProducer(),new CookieProducer()));sweetCreator.createSweets();}
}
此例中,SweetCreator
类仅知晓SweetProducer
类,而不了解每个甜点的具体实现。这种分离使类能灵活更新和重用,并大幅提升代码可维护性。设计代码时,应始终寻求使其尽可能灵活和可维护。多态是编写可重用Java代码的强力技术。
提示:@Override
注解强制程序员使用必须被重写的相同方法签名。若方法未被重写,将产生编译错误。
方法重载是多态吗?
许多程序员对多态与方法重写、重载的关系感到困惑。但只有方法重写是真正的多态。重载共享相同方法名但参数不同。多态是广义术语,因此相关讨论将持续存在。
方法重写中的多态
若返回类型是协变类型,则允许修改重写方法的返回类型。协变类型本质上是返回类型的子类。示例如下:
public abstract class JavaMascot {abstract JavaMascot getMascot();
}public class Duke extends JavaMascot {@OverrideDuke getMascot() {return new Duke();}
}
由于Duke
是JavaMascot
的子类,我们可在重写时修改返回类型。
核心Java类中的多态
我们在核心Java类中频繁使用多态。一个简单示例是实例化ArrayList
类时声明List
接口为类型:
List<String> list = new ArrayList<>();
进一步观察以下未使用多态的Java集合API代码:
public class ListActionWithoutPolymorphism {// 无多态的示例void executeVectorActions(Vector<Object> vector) {/* 此处代码重复 */}void executeArrayListActions(ArrayList<Object> arrayList) {/* 此处代码重复 */}void executeLinkedListActions(LinkedList<Object> linkedList) {/* 此处代码重复 */}void executeCopyOnWriteArrayListActions(CopyOnWriteArrayList<Object> copyOnWriteArrayList){ /* 此处代码重复 */}
}public class ListActionInvokerWithoutPolymorphism {listAction.executeVectorActions(new Vector<>());listAction.executeArrayListActions(new ArrayList<>());listAction.executeLinkedListActions(new LinkedList<>());listAction.executeCopyOnWriteArrayListActions(new CopyOnWriteArrayList<>());
}
这段代码很糟糕,不是吗?想象维护它的难度!现在观察使用多态的相同示例:
public static void main(String … polymorphism) {ListAction listAction = new ListAction(); listAction.executeListActions();
}
public class ListAction {void executeListActions(List<Object> list) {// 对不同列表执行操作}
}
public class ListActionInvoker {public static void main(String... masterPolymorphism) {ListAction listAction = new ListAction();listAction.executeListActions(new Vector<>());listAction.executeListActions(new ArrayList<>());listAction.executeListActions(new LinkedList<>());listAction.executeListActions(new CopyOnWriteArrayList<>());}
}
多态的优势在于灵活性和扩展性。我们无需创建多个不同方法,只需声明一个接收通用List
类型的方法。
多态方法调用与类型转换
可以在多态调用中调用特定方法,但会牺牲灵活性。示例如下:
public abstract class MetalGearCharacter {abstract void useWeapon(String weapon);
}
public class BigBoss extends MetalGearCharacter {@Overridevoid useWeapon(String weapon) {System.out.println("Big Boss is using a " + weapon);}void giveOrderToTheArmy(String orderMessage) {System.out.println(orderMessage);}
}
public class SolidSnake extends MetalGearCharacter {void useWeapon(String weapon) {System.out.println("Solid Snake is using a " + weapon);}
}
public class UseSpecificMethod {public static void executeActionWith(MetalGearCharacter metalGearCharacter) {metalGearCharacter.useWeapon("SOCOM");// 以下行无法工作// metalGearCharacter.giveOrderToTheArmy("Attack!");if (metalGearCharacter instanceof BigBoss) {((BigBoss) metalGearCharacter).giveOrderToTheArmy("Attack!");}}public static void main(String... specificPolymorphismInvocation) {executeActionWith(new SolidSnake());executeActionWith(new BigBoss());}
}
此处使用的技术是类型转换(casting),即在运行时显式改变对象类型。
注意:只有将通用类型强制转换为具体类型后,才能调用特定方法。这相当于明确告诉编译器:“我知道自己在做什么,因此要将对象转换为具体类型并使用特定方法。”
在上述示例中,编译器拒绝接受特定方法调用的原因很重要:传入的类可能是SolidSnake
。在此情况下,编译器无法确保每个MetalGearCharacter
的子类都声明了giveOrderToTheArmy
方法。
保留关键字
注意保留字instanceof
。在调用特定方法前,我们需检查MetalGearCharacter
是否为BigBoss
的实例。若非BigBoss
实例,将收到以下异常信息:
Exception in thread "main" java.lang.ClassCastException: com.javaworld.javachallengers.polymorphism.specificinvocation.SolidSnake cannot be cast to com.javaworld.javachallengers.polymorphism.specificinvocation.BigBoss
若需引用Java超类的属性或方法,可使用保留字super
。例如:
public class JavaMascot {void executeAction() {System.out.println("The Java Mascot is about to execute an action!");}
}
public class Duke extends JavaMascot {@Overridevoid executeAction() {super.executeAction();System.out.println("Duke is going to punch!");}public static void main(String... superReservedWord) {new Duke().executeAction();}
}
在Duke的executeAction
方法中使用super
可调用超类方法,再执行Duke的特定动作。因此输出如下:
The Java Mascot is about to execute an action!
Duke is going to punch!
多态的常见错误
- 常见错误是认为无需类型转换即可调用特定方法。
- 另一个错误是在多态实例化类时不确认将调用哪个方法。需记住:被调用的方法是所创建实例的方法。
- 还需注意方法重写不同于方法重载。
- 若参数不同,则无法重写方法。若返回类型是超类方法的子类,则可以修改重写方法的返回类型。
关于多态需要记住的要点
- 所创建的实例将决定使用多态时调用哪个方法。
@Override
注解强制程序员使用重写方法;否则将产生编译错误。- 多态可用于普通类、抽象类和接口。
- 大多数设计模式依赖某种形式的多态。
- 调用多态子类中特定方法的唯一方式是使用类型转换。
- 可通过多态设计强大的代码结构。
接受Java多态挑战!
让我们测试你对多态和继承的理解。在此挑战中,你需要根据Matt Groening的辛普森一家代码推断每个类的输出。首先仔细分析以下代码:
public class PolymorphismChallenge {static abstract class Simpson {void talk() {System.out.println("Simpson!");}protected void prank(String prank) {System.out.println(prank);}}static class Bart extends Simpson {String prank;Bart(String prank) { this.prank = prank; }protected void talk() {System.out.println("Eat my shorts!");}protected void prank() {super.prank(prank);System.out.println("Knock Homer down");}}static class Lisa extends Simpson {void talk(String toMe) {System.out.println("I love Sax!");}}public static void main(String... doYourBest) {new Lisa().talk("Sax :)");Simpson simpson = new Bart("D'oh");simpson.talk();Lisa lisa = new Lisa();lisa.talk();((Bart) simpson).prank();}
}
你认为最终输出是什么?不要使用IDE!重点是提升代码分析能力,请自行推断结果。
选项:
A)
I love Sax! D'oh Simpson! D'oh
B)
Sax :) Eat my shorts! I love Sax! D'oh Knock Homer down
C)
Sax :) D'oh Simpson! Knock Homer down
D)
I love Sax! Eat my shorts! Simpson! D'oh Knock Homer down
解答挑战
对于以下方法调用:
new Lisa().talk("Sax :)");
输出为“I love Sax!”,因为我们向方法传递了字符串且Lisa类有此方法。
下一调用:
Simpson simpson = new Bart("D'oh");
simpson.talk();
输出为“Eat my shorts!”,因为我们用Bart实例化了Simpson类型。
以下调用较为复杂:
Lisa lisa = new Lisa();
lisa.talk();
此处通过继承使用了方法重载。由于未向talk
方法传递参数,因此调用Simpson
的talk
方法,输出为:
"Simpson!"
最后一个调用:
((Bart) simpson).prank();
此例中,prank
字符串在实例化Bart时通过new Bart("D'oh")
传入。此时首先调用super.prank
方法,再执行Bart的特定prank
方法。输出为:
"D'oh"
"Knock Homer down"
因此正确答案是D。输出为:
I love Sax!
Eat my shorts!
Simpson!
D'oh
Knock Homer down
【注】本文译自:Polymorphism and inheritance in Java | InfoWorld
相关文章:
Java中的多态与继承
Java中的多态与继承 开始学习Java中的多态及如何在多态方法调用中进行方法调用 多态——即对象根据其类型执行特定操作的能力——是Java代码灵活性的核心。四人组(Gang Of Four)创建的许多设计模式都依赖于某种形式的多态,包括命令模式。本文…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(12): ておき ます
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(12): ておき ます。 1、前言(1)情况说明(2)工程师的信仰 2、知识点(1)~ておき ます。(2&#x…...
MicroPython for esp32s3开发HX711称重模块指南
一、HX711模块基本介绍 一)、核心功能 24位高精度ADC 专为称重传感器设计的模数转换芯片,支持20mV或40mV满幅差分输入内置128/64倍可编程增益放大器(通道A)及固定32倍增益(通道B) 集成化设计 集成…...
智能机器人在物流行业的应用:效率提升与未来展望
随着全球电子商务的蓬勃发展,物流行业正面临着前所未有的挑战和机遇。传统的物流模式已经难以满足日益增长的市场需求,尤其是在效率、成本控制和精准配送方面。智能机器人技术的出现,为物流行业的转型升级提供了强大的动力。本文将探讨智能机…...
MiWi|Microchip开发的专有无线通信协议,适用于低功耗、短距离的无线个人局域网【无线通信小百科】
1、什么是MiWi MiWi(Microchip Wireless)是一种由 Microchip 公司开发的专有无线通信协议。 它基于 IEEE 802.15.4 标准,适用于低功耗、短距离的无线个人局域网(WPAN,Wireless Personal Area Network)。 M…...
分布式事务,事务失效,TC事务协调者
1. 概述 本方案书旨在解决分布式系统中事务一致性问题,重点阐述全局事务标识(XID)的传递与存储机制、事务协调者(TC)的设计与部署,以及分布式事务失效场景的应对策略。基于业界成熟框架(如Seat…...
ESP32开发-作为TCP客户端发送数据到网络调试助手
代码(作为TCP客户端) #include <SPI.h> #include <EthernetENC.h> // 使用EthernetENC库// 网络配置 byte mac[] {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // MAC地址 IPAddress ip(192, 168, 1, 100); // ESP32的IP IPAddr…...
halcon打开图形窗口
1、dev_open_window 参数如下: 1)Row(输入参数) y方向上,图形窗口距离左上角顶端的像素个数 2)Column(输入参数) x方向上,距离左上角左边的像素个数 3)Width(输入参数) 图形窗口宽度 4)He…...
LVGL -按键介绍 下
4 图标 4.1 内置图标 LVGL 提供了一个很方便的 图标字体 系统,它使用了 lv_label 来显示文本或图标。你可以选择 Font Awesome 或其他图标字体,并将其直接嵌入应用中。LVGL 内建图标字体(如 LV_SYMBOL_*)是可以改变大小的。通过…...
【默子速报】DeepSeek新模型 Prover-V2 报告解读
炸裂,太炸裂了,五一不放假是吧?! 默子加班加点的肝解读! 首先是,Deepseek今天下午显示毫无预兆的在HF上发布了最新的Prover-V2参数 直接让一群人瞬间热血沸腾,想要看看Deepseek又干了什么大事。…...
冰冰一号教程网--介绍采用vuepress搭建个人博客
文章说明 采用vuepress可以快速搭建个人网站,风格统一;采用GPT可以将博文转化为个人博客网站 冰冰一号教程网 访问地址 目前只支持到 2025年05月1号 22点 教程包括主流编程语言:Java、JavaScript、python、C语言、C、C# 教程讲义由GPT生成&am…...
借助电商 API 接口实现电商平台商品数据分析的详细步骤分享
在数字化商业浪潮中,电商平台积累了海量数据。如何从这些数据中挖掘有价值的信息,成为电商企业提升竞争力的关键。电商 API 接口在这一过程中发挥着核心作用,它为获取和分析商品数据提供了高效途径。本文将详细介绍借助电商 API 接口实现电商…...
32单片机——串口
1、通信 通信的方式可以分为多种: (1)按照数据传送方式可分为串行通信和并行通信; ①串行通信 基本特征:数据逐位顺序依次传输 优点:传输线少、布线成本低、灵活度高等优点,一般用于近距离人…...
6.应用层
6. 应用层 1. 概述 应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分 早期基于文本的应用(电子邮件、远程登录、文件传输、新闻组)20世纪90年代将因特网带入千家万户的万维…...
【鸿蒙HarmonyOS】一文详解华为的服务卡片
7.服务卡片 1.什么是卡片 Form Kit(卡片开发服务)提供一种界面展示形式,可以将应用的重要信息或操作前置到服务卡片(以下简称“卡片”),以达到服务直达、减少跳转层级的体验效果。卡片常用于嵌入到其他应…...
深度卷积模型:案例研究
1 为什么要进行案例研究? 过去,计算机视觉中的大量研究都集中在如何将卷积层、池化层以及全连接层这些基本组件组合起来,形成有效的卷积神经网络。 找感觉的最好方法之一就是去看一些示例,就像很多人通过看别人的代码来学习编程一…...
BBR 的 RTT 公平性问题求解
如果 BBR 要跟 reno/cubic 公平,只能顾此失彼,没有任何变通方法,唯一的方法就是在放弃 reno/cubic,但前提你得保证 BBR 流之间是公平的。如果非要照顾 reno/cubic,那就必须要变成 reno/cubic,这就是 BBRv2/…...
SQL命令二:SQL 高级查询与特殊算法
引言 在掌握了 SQL 的基础操作和建表约束后,我们可以进一步探索 SQL 的高级查询功能和一些特殊算法。这些高级技巧能够帮助我们更高效地处理和分析数据,满足复杂的业务需求。 一、查询进阶 (一)简单查询 简单查询通过 select 语…...
Databend 产品月报(2025年4月)
很高兴为您带来 Databend 2025 年 4 月的最新更新、新功能和改进!我们希望这些增强功能对您有所帮助,并期待您的反馈。 BendDeploy:安装 Databend 的新方式 BendDeploy 是由 Databend 开发的一款基于 Kubernetes 的平台,旨在简化…...
Best Video下载器——全能高清无水印视频下载工具
在当今短视频和流媒体盛行的时代,用户经常遇到想要下载视频却受限于平台限制的情况。无论是收藏喜欢的影视片段、保存有价值的教程,还是进行二次创作,一款高效、免费且支持多平台的视频下载工具显得尤为重要。Best Video下载器正是为此而生&a…...
2025东三省D题深圳杯D题数学建模挑战赛数模思路代码文章教学
完整内容请看文章最下面的推广群 一、问题一:混合STR图谱中贡献者人数判定 问题解析 给定混合STR图谱,识别其中的真实贡献者人数是后续基因型分离与个体识别的前提。图谱中每个位点最多应出现2n个峰(n为人数),但由…...
这些是什么充电模块调试手段,对USB、Thermal、DP
在电子产品开发中,充电模块调试及对相关模块的了解是保障产品性能与稳定性的关键环节。下面为你详细介绍: 充电模块调试手段:充电模块负责将外部电源的电能转化为适用于设备的电能,并对电池进行充电管理。调试手段包括使用专业的…...
Gradio全解20——Streaming:流式传输的多媒体应用(2)——构建对话式聊天机器人
Gradio全解20——Streaming:流式传输的多媒体应用(2)——构建对话式聊天机器人 本篇摘要20. Streaming:流式传输的多媒体应用20.2 构建对话式聊天机器人20.2.1 应用概述20.2.2 记录用户音频20.2.3 存储音频并生成响应20.2.4 构建G…...
字节暑期实习-网络运维工程师面经
岗位描述 这个是ByteIntern实习,是暑期实习岗位 岗位 一面 先自我介绍 抓项目技术(会进行确认是什么技术) TCP的三次握手和四次挥手 序列号和确认应答号的位置和大小 序列号是随机的吗? 序列号为什么是随机的? …...
多用户远程 Debugger 服务隔离方案技术实践
多用户远程 Debugger 服务隔离方案技术实践 摘要: 针对多用户同时连接远程 Debugger 服务可能导致的断点冲突、调试流程干扰等问题,本文基于主流调试工具(如 Python debugpy、Java JDWP、Node.js Inspector 等),梳理和…...
华为发布全球首个L3商用智驾ADS4.0
2024年10月2024世界智能网联汽车大会上,余承东讲到:“华为ADS 4.0将于2025年推出高速L3级自动驾驶商用及城区L3级自动驾驶试点,希望加快L3级自动驾驶标准的进程,推动L3级自动驾驶技术的普及。” 世界智能网联汽车大会演讲PPT 所以…...
Silo 科学数据工具库安装与使用指南
Silo 科学数据工具库安装与使用指南 Silo 是一个用于科学数据可视化和分析的工具库,由 Lawrence Livermore National Laboratory (LLNL) 开发。以下是 Silo 的安装和使用方法: 安装 Silo Linux 系统安装 从源码安装: wget https://wci.lln…...
vs2019编译occ7.9.0时,出现fatal error C1060: compiler is out of heap space
问题描述 visual studio 2019编译opencascade 7.9.0时,出现编译错误 fatal error C1060: compiler is out of heap space 解决方案 修改vs2019并行编译的线程个数,默认是12个,我改成了4个,问题解决 Tools > Project and Sol…...
Poco C++全面开发指南:网络应用开发
UDP接收器 项目结构 poco_demo/ ├── CMakeLists.txt ├── src/ │ ├── main.cpp │ └── Receiver.cpp └── include/└── Receiver.h创建 Receiver.h #pragma once#include <Poco/Net/DatagramSocket.h> #include <Poco/Net/SocketAddress.h>…...
Spring AOP概念及其实现
一、什么是AOP 全称Aspect Oriented Programming,即面向切面编程,AOP是Spring框架的第二大核心,第一大为IOC。什么是面向切面编程?切面就是指某一类特定的问题,所以AOP也可以称为面向特定方法编程。例如对异常的统一处…...
业务部绩效考核关键指标与数据分析
在业务部的绩效考核中,重点通过销售额、客户关系、财务管理等多个维度来评估团队的工作成果。绩效考核指标(KPI)不仅帮助公司衡量销售团队的业绩,还能反映出团队在客户管理、财务控制以及市场拓展方面的综合表现。每一个考核指标都…...
线上婚恋相亲小程序源码介绍
基于ThinkPHP、FastAdmin和UniApp开发的线上婚恋相亲小程序源码,这款小程序源码采用了ThinkPHP作为后端框架,其强大的功能与良好的扩展性为程序的稳定运行提供了保障。 FastAdmin作为后台管理框架,使得管理员能够便捷地对用户信息、相亲…...
【SystemC初认识】SystemC是什么?有哪些主要组件?如何简单使用?
【SystemC初认识】SystemC是什么?有哪些主要组件?如何简单使用? 1 SystemC简介2 主要组件3 关于时序与调度4 如何安装4.1 安装C编译器4.2 安装SystemC 库 5 SystemC代码示例6 关于SystemC 仿真与调度7 SystemC 中的常用类和函数8 常见的设计模…...
软考:硬件中的CPU架构、存储系统(Cache、虚拟内存)、I/O设备与接口
文章目录 1. 引言1.1 硬件知识的重要性1.2 软件设计师考试中硬件的考察目标 2. CPU架构2.1 CPU的基本概念2.2 CPU的内部结构2.3 CPU的工作原理2.4 指令集架构(ISA)2.5 多核处理器 3. 存储系统3.1 存储器的基本概念3.2 主存储器(RAM࿰…...
力扣hot100——98.验证二叉搜索树
题目链接:98. 验证二叉搜索树 - 力扣(LeetCode) 首先列举一个错误代码 class Solution { public:bool isValidBST(TreeNode* root) {if(rootnullptr) return true;if(root->right){if(root->right->val<root->val) return f…...
UE 像素和线框盒子 材质
像素材质: 线框盒子材质:...
工业质检领域相关近期顶会论文汇总CVPR2025
目录 异常检测Anomaly Detection多类别数据集开集有监督异常检测Open-set Supervised Anomaly Detection(OSAD)基于多模态大模型能力 骨干网络Mamba系列(mamba为transformer后的新骨干网络形式)其他 目标检测开集识别DETR实例检测…...
leetcode76
目录 803ms超时。。。。越改越超时。。。 一些纠缠 代码分析: 代码问题: 改进建议: 示例代码: The error message you’re seeing indicates that there is a reference binding to a null pointer in your code. This typ…...
Android Studio下载安装教程
## 什么是Android Studio Android Studio是Google官方推出的Android应用开发集成环境(IDE),基于IntelliJ IDEA开发,专门用于Android应用开发。它包含了代码编辑器、可视化布局编辑器、应用性能分析工具、模拟器等功能,为开发者提供了一站式的…...
shell---expect
1.expect的安装 [rootqfedu ~] yum -y install expect 2.expect的语法: 用法: 1)定义expect脚本执行的shell #!/usr/bin/expect -----类似于#!/bin/bash 2)spawn spawn是执行expect之后后执行的内部命令开启一个会话 #功能:用来执行shell的交互命令 3)…...
基于PHP的在线编程课程学习系统
有需要请加文章底部Q哦 可远程调试 基于PHP在线编程课程学习系统 一 介绍 在线编程课程学习系统基于原生PHP开发,数据库mysql,前端jquery.js。系统角色分为学生,教师和管理员。(附带参考设计文档) 技术栈:phpmysqljquery.jsphps…...
深度学习概述
近年来,我们在媒体上到处可见人工智能(AI)这个词,而深度学 习是人工智能的一种实现方法。下面我们就来简单地看一下深度学习具 有怎样划时代的意义。 下面是三张花的图片,它们都具有同一个名字,那究竟是什…...
[原创](现代Delphi 12指南):[macOS 64bit App开发]: [1]如何使用原生NSAlert消息框 (runModal模式)
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...
【NumPy完全指南】从基础操作到高性能计算实战
📑 目录 一、NumPy核心价值1.1 科学计算现状分析1.2 ndarray设计哲学 二、核心数据结构解析2.1 ndarray内存布局2.2 数据类型体系 三、矢量化编程实践3.1 通用函数(ufunc)示例3.2 广播机制图解 四、高性能计算进阶4.1 内存预分配策略4.2 Cython混合编程 五、典型应用…...
深入解析词嵌入(Word2Vec、GloVe)技术原理:从词语到向量的转变
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4o-mini模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...
Android学习总结之点击登录按钮流程
1. 事件分发阶段 1.1 触摸事件产生 当用户点击屏幕上的登录按钮时,触摸屏硬件会检测到触摸操作,并将触摸事件的相关信息(如触摸的坐标、触摸的时间等)传递给 Android 系统的 InputManagerService。 1.2 Activity 接收事件 Inp…...
多数元素题解(LC:169)
169. 多数元素 核心思想(Boyer-Moore 投票算法): 解题思路:可以使用 Boyer-Moore 投票算法、该算法的核心思想是: 维护一个候选元素和计数器、初始时计数器为 0。 遍历数组: 当计数器为 0 时、设置当前元…...
C# 在VS2022中开发常用设置
一、基础环境配置 1. 安装必要组件 在 VS2022 安装时确保勾选以下工作负载: 使用 .NET 的桌面开发(包含 WPF/WinForms)ASP.NET 和 Web 开发.NET 跨平台开发Azure 开发数据存储和处理 2. 主题与外…...
三个概念:DataBinding,Dependency Property 与DataTemplate
WPF 核心概念详解:DataBinding、Dependency Property 和 DataTemplate 1. DataBinding (数据绑定) 基本概念 DataBinding 是 WPF 的核心机制,用于在 UI 元素和数据源之间建立自动同步关系。 关键特性 双向绑定:数据变化自动反映到 UI&…...
基于C#开发的适合Windows开源文件管理器
使用DDD从零构建一个完整的系统 推荐一个功能强大且直观的开源文件管理器,适用于Windows平台。 01 项目简介 该项目是一个基于C#开发、开源的文件管理器,适用于Windows,界面UI美观、方便轻松浏览文件。此外,支持创建和提取压缩…...