【魔法森林冒险】2/14 抽象层设计:Figure/Person类(所有角色的基石) 📅 发布时间:2026/7/8 12:30:05 👁️ 浏览次数: 个人主页黎雁作者简介C/C/JAVA后端开发学习者❄️个人专栏C语言、数据结构C语言、EasyX、JAVA、游戏、规划、程序人生✨ 从来绝巘须孤往万里同尘即玉京文章目录【魔法森林冒险】2/14 抽象层设计Figure/Person类所有角色的基石️ 文章摘要 一、为什么需要抽象层—— 从「重复代码」到「优雅复用」 二、核心代码拆解Figure类顶级角色抽象类2.1 完整代码核心片段2.2 关键知识点讲解 三、核心代码拆解Person类可交互角色抽象类3.1 完整代码核心片段3.2 关键知识点讲解 四、新手使用抽象类的3个高频易错点易错点1试图实例化抽象类易错点2子类未实现所有抽象方法易错点3忽略构造方法的调用顺序 五、抽象层如何支撑所有角色的拓展核心逻辑 知识回顾✍️ 写在最后【魔法森林冒险】2/14 抽象层设计Figure/Person类所有角色的基石️ 文章摘要内容维度详情说明核心摘要本文是「魔法森林冒险」Java项目系列第二篇聚焦游戏的「角色抽象层」核心——Figure和Person类。带你吃透抽象类的设计逻辑为什么要设计这两个顶层抽象类通用属性/方法如何封装Allen/Lia/老贤者等角色如何基于此扩展同时拆解新手使用抽象类的高频坑点。阅读时长10分钟适合人群1. Java新手想理解抽象类的实际应用场景2. 面向对象学习者想掌握「代码复用拓展性」的设计思路3. 项目复刻者想搞懂角色体系的底层逻辑。阅读重点1. Figure/Person类的核心属性与方法设计2. 抽象方法的预留扩展逻辑3. 新手使用抽象类的3个易错点4. 抽象类如何支撑Allen/Lia等角色的拓展。 一、为什么需要抽象层—— 从「重复代码」到「优雅复用」在开发游戏角色时你会发现Allen、Lia、老贤者、甚至敌人都有共同的属性/行为比如都有生命值、都能判断是否存活、都有名称。如果为每个角色单独写这些逻辑会出现大量重复代码❌Allen写一遍isAlive()判断存活Lia再写一遍isAlive()老贤者还要写一遍…而抽象类abstract class就是解决这个问题的「利器」✅抽象类 通用属性/方法实现 抽象方法只定义子类实现作用为子类提供「模板」既复用通用逻辑又强制子类实现专属功能。本项目中Figure是「所有角色的顶级抽象模板」Person是「可交互角色的专属模板」二者共同构成了所有角色的底层基石。 二、核心代码拆解Figure类顶级角色抽象类先看你提供的Figure.java核心代码未修改仅拆分讲解2.1 完整代码核心片段/** * 所有角色的顶级抽象类 * 定义所有角色的通用状态和基础行为 */publicabstractclassFigure{// 通用属性角色名称privateStringname;// 通用属性是否存活所有角色都有这个状态privatebooleanisAlive;// 通用属性角色描述privateStringdescription;// 构造方法初始化通用属性publicFigure(Stringname,Stringdescription){this.namename;this.descriptiondescription;this.isAlivetrue;// 初始默认存活}// 通用方法判断是否存活所有角色通用直接实现publicbooleanisAlive(){returnthis.isAlive;}// 通用方法设置存活状态比如战斗死亡后调用publicvoidsetAlive(booleanalive){isAlivealive;}// 抽象方法角色的专属行为强制子类实现// 比如Allen的行为是「冒险」Lia的行为是「辅助」敌人的行为是「攻击」publicabstractvoidact();// Getter/Setter封装属性新手必学publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetDescription(){returndescription;}publicvoidsetDescription(Stringdescription){this.descriptiondescription;}}2.2 关键知识点讲解通用属性设计name/description所有角色都有「名字」和「描述」无需子类重复定义isAlive所有角色都有「存活状态」初始值true出生即存活。通用方法设计isAlive()/setAlive()判断/修改存活状态所有角色逻辑完全一致直接实现这就是「代码复用」—— 子类继承Figure后直接能用这些方法不用自己写。抽象方法act()用abstract修饰只有方法签名没有方法体作用强制所有子类必须实现「角色专属行为」比如Allen的act()是选择冒险行动Goblin的act()是选择攻击/逃跑新手坑如果子类不实现抽象方法编译直接报错 三、核心代码拆解Person类可交互角色抽象类Person继承自Figure是「玩家/盟友/NPC」的专属抽象类敌人不继承Person因为敌人的交互逻辑不同。3.1 完整代码核心片段/** * 可交互角色抽象类玩家/盟友/老贤者等 * 继承Figure扩展可交互角色的专属属性/方法 */publicabstractclassPersonextendsFigure{// 专属属性生命值HPprivateinthp;// 专属属性魔法值MPprivateintmp;// 专属属性金币用于交易privateintgold;// 专属属性背包存储道具用数组实现privateItem[]backpack;// 背包容量privatestaticfinalintBACKPACK_CAPACITY10;// 构造方法先调用父类Figure的构造再初始化专属属性publicPerson(Stringname,Stringdescription,inthp,intmp,intgold){super(name,description);// 必须先调用父类构造this.hphp;this.mpmp;this.goldgold;this.backpacknewItem[BACKPACK_CAPACITY];// 初始化背包数组}// 通用方法获取HP封装避免直接修改publicintgetHp(){returnhp;}// 通用方法设置HP带校验避免HP为负publicvoidsetHp(inthp){if(hp0){this.hp0;// HP最低为0不能为负this.setAlive(false);// HP为0则死亡}else{this.hphp;}}// 通用方法获取MPpublicintgetMp(){returnmp;}// 通用方法设置MP带校验publicvoidsetMp(intmp){this.mpMath.max(mp,0);// 简化校验MP最低为0}// 通用方法拾取道具背包逻辑所有可交互角色通用publicbooleanpickItem(Itemitem){// 遍历背包找空位置for(inti0;ibackpack.length;i){if(backpack[i]null){backpack[i]item;System.out.println(this.getName()拾取了item.getName());returntrue;}}// 背包满了System.out.println(this.getName()的背包已满无法拾取item.getName());returnfalse;}// 抽象方法使用道具不同角色使用道具逻辑不同强制子类实现publicabstractbooleanuseItem(Itemitem);// 抽象方法交易Allen和老贤者交易Lia不交易逻辑不同publicabstractbooleantrade(Persontarget,Itemitem,intgold);// 其他Getter/Setter省略和Figure类逻辑一致}3.2 关键知识点讲解继承的核心用法extends FigurePerson继承Figure的所有非私有属性/方法name/isAlive()等super(name, description)构造方法中必须先调用父类构造这是Java继承的强制规则。专属属性设计hp/mp/gold玩家/盟友/NPC的核心资源敌人虽然也有HP但因为交互逻辑不同敌人继承Figure而非Personbackpack用数组实现背包容量10所有可交互角色都有背包复用这个逻辑。属性封装重点所有属性用private修饰通过getter/setter访问setHp()带校验HP不能为负HP为0时自动设置为死亡setAlive(false)新手坑直接暴露属性比如public int hp会导致数据混乱封装是面向对象的核心抽象方法的拓展性useItem()Allen使用治疗药水是恢复HPLia使用魔法花是提升信任度逻辑不同所以定义为抽象方法trade()Allen可以和老贤者交易Lia不能交易强制子类按自身逻辑实现。 四、新手使用抽象类的3个高频易错点结合本项目总结新手最容易踩的坑易错点1试图实例化抽象类// 错误示例抽象类不能new对象FigurefigurenewFigure(测试角色,测试描述);PersonpersonnewPerson(Allen,魔法学徒,100,50,10);✅ 正确做法只能实例化「继承抽象类的子类」比如Allen、LiaAllenallennewAllen(艾伦,魔法学徒,100,50,10);易错点2子类未实现所有抽象方法如果Allen类只实现了act()没实现useItem()编译报错Error: Allen is not abstract and does not override abstract method useItem(Item) in Person✅ 正确做法子类必须实现父类所有抽象方法除非子类也是抽象类。易错点3忽略构造方法的调用顺序如果Person的构造方法没写super(name, description)编译报错Error: Constructor call must be the first statement in a constructor✅ 正确做法子类构造方法第一行必须调用父类构造super()如果父类无参构造可省略如果父类有参构造必须显式调用。 五、抽象层如何支撑所有角色的拓展用一张图看懂Figure/Person的「承上启下」作用Figure顶级抽象Person可交互角色抽象Allen玩家实现act/useItem/tradeLia盟友实现act/useItem/tradeOldSage老贤者实现act/useItem/tradeEnemy敌人抽象实现actGoblin哥布林TreeSpirit树灵BOSSNatural中立角色实现actAnimal受伤动物核心逻辑向上复用Allen/Lia/老贤者都复用Person的「HP/MP/背包/拾取道具」逻辑向下拓展每个角色通过实现抽象方法拥有专属行为比如Allen的useItem()是用治疗药水Lia的useItem()是用魔法花横向隔离敌人Enemy和可交互角色Person都继承Figure但各自拓展不同属性逻辑不混淆。 知识回顾Figure是所有角色的顶级抽象类定义「存活状态/名称」等通用属性/方法抽象方法act()强制子类实现专属行为Person继承Figure是可交互角色的抽象类扩展「HP/MP/金币/背包」等专属属性抽象方法useItem()/trade()支撑角色差异化抽象类的核心价值是「复用通用逻辑强制子类实现专属逻辑」避免重复代码新手使用抽象类的3个坑实例化抽象类、未实现所有抽象方法、构造方法调用顺序错误。✍️ 写在最后Figure和Person类看似简单却是整个项目「面向对象设计」的灵魂——正是因为有了这两层抽象后续新增角色比如矮人、精灵盟友时只需继承对应抽象类实现专属方法无需重复写通用逻辑。下一篇我们会聚焦「Allen类一主角核心属性与初始化」带你看作为玩家的Allen如何基于Person抽象类实现专属的属性设计和初始化逻辑。如果你是新手建议把Figure/Person的代码复制到IDE中尝试写一个「测试子类」比如TestPerson extends Person实现所有抽象方法理解继承和抽象的用法思考Enemy类继承Figure后应该扩展哪些专属属性比如攻击力、防御力。 系列文章导航项目总览设计与架构抽象层设计Figure/Person类本文Allen类一核心属性与初始化…后续篇章持续更新 评论区互动你觉得抽象类和普通类最大的区别是什么在这个游戏项目中还有哪些地方可以用抽象类优化
工业级的OCR有哪些选择?AI大模型项目实战之从0到1掌握Dify:聊天助手、工作流与MCA记成实战、精通qwen3+MCP协议与开发! 工业级的OCR有哪些选择?AI大模型项目实战之从0到1掌握Dify:聊天助手、工作流与MCA记成实战、精通qwen3MCP协议与开发! 以下是针对您提出的两个主要问题的详细解答: 一、工业级OCR方案选型 1. 开源方案 Tesseract(H… 2026/7/7 21:26:33
Python计算机毕设之基于Django的在线考试与评估系统设计与实现基于Python+Django的在线考试与成绩评估系统设计与实现(完整前后端代码+说明文档+LW,调试定制等) java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、… 2026/7/7 12:47:42
10款Bug管理系统盘点:流程定制、通知降噪、报表复盘全解析 本文将深入对比2026年10款Bug跟踪管理系统:PingCode、Jira Software、Azure DevOps、GitLab Issues、YouTrack、Linear、Bugzilla、MantisBT、Worktile、TAPD。一、选型先定标准:流程跑得顺、通知不扰民、统计能复盘1、流程怎么判断“好不好用”… 2026/7/6 9:52:26
D3KeyHelper终极指南:如何快速配置暗黑3专业级按键宏工具 D3KeyHelper终极指南:如何快速配置暗黑3专业级按键宏工具 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为《暗黑破… 2026/7/8 12:26:01
STM32与MP2672A实现锂电池智能平衡充电系统 1. 项目背景与核心需求在锂电池组应用中,电压不均衡是影响电池寿命和安全性的关键问题。当多节锂电池串联使用时,由于制造工艺差异、温度分布不均等因素,各单体电池的电压会出现偏差。这种不均衡会导致部分电池过充或过放,严重时可… 2026/7/8 12:23:59
工业金属表面缺陷检测:4种光学成像方案(明/暗/漫/背光)选型与实战对比 工业金属表面缺陷检测:4种光学成像方案实战指南1. 光学成像在金属检测中的核心地位金属表面缺陷检测系统的成败,八成取决于前端光学成像的质量。想象一下,当光线照射在金属表面时,不同材质、不同工艺处理的金属会呈现出截然不同的… 2026/7/8 12:21:57
原来上海玉灵膏的制作工艺竟然这么讲究? 原来上海玉灵膏的制作工艺竟然这么讲究?上海玉灵膏,作为一款经典的药食同源养生膏方,其制作工艺不仅传承了古法精髓,还结合了现代科技,确保每一瓶膏方都能达到最佳品质。本文将深入探讨上海玉灵膏的制作工艺࿰… 2026/7/8 12:21:57
GitHub今日热榜 | 2026-07-07:WiFi感知和视频分析进入榜单 昨日对比速览状态项目昨排今排变化持续asgeirtj/system_prompts_leaks31排名升2,Star增40%新进addyosmani/agent-skills-2新上榜持续Zackriya-Solutions/meetily13排名降2,Star增77%新进ruvnet/RuView-4新上榜持续Leonxlnx/taste-skill45排名降1… 2026/7/8 12:19:50
基于ICM-42605和dsPIC30F3014的6DOF运动追踪系统设计 1. 项目背景与核心需求解析 在当今的工业自动化和消费电子领域,精确追踪物体在三维空间中的运动和方向已经成为许多应用的基础需求。从无人机飞控系统到虚拟现实设备,从工业机械臂到运动捕捉系统,都需要实时获取物体的6自由度(6DO… 2026/7/8 12:17:48
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/7 11:26:58