Java继承中子类状态管理:正确更新父类私有字段的实践

Java继承中子类状态管理:正确更新父类私有字段的实践

本文探讨了java继承中子类修改父类私有字段的常见误区及解决方案。通过分析一个银行账户示例,揭示了在子类方法中创建局部变量而非更新父类实例字段的问题。教程强调了利用父类提供的公共setter方法来安全、有效地管理和修改继承状态的重要性,确保数据一致性,并提供了详细的代码示例和最佳实践。

理解Java继承与状态管理

在Java面向对象编程中,继承允许子类复用父类的属性和行为。然而,当子类需要修改父类中定义的私有(private)字段时,需要遵循特定的规则。直接访问或修改私有字段是不允许的,子类必须通过父类提供的公共(public)或受保护(protected)的访问器方法(即getter和setter)来进行操作。

考虑一个银行账户系统,其中BaseAccount作为基类,DebitCard作为其子类。BaseAccount包含账户余额currentAmount等信息。DebitCard类需要实现取款(withdraw)功能,这涉及到修改继承自BaseAccount的currentAmount。

初始问题分析

以下是最初的代码结构,其中DebitCard的withdraw方法未能正确更新账户余额:

// BaseAccount.javapublic class BaseAccount {    private double opening;    private double currentAmount = 0.0; // 账户当前余额    private double amount; // 未使用的字段,可考虑移除    public BaseAccount(double opening, double currentAmount, double amount) {        this.opening = opening;        this.currentAmount = currentAmount;        this.amount = amount;    }    // Getter和Setter方法    public double getOpening() { return opening; }    public void setOpening(double opening) { this.opening = opening; }    public double getCurrentAmount() { return currentAmount; }    public void setCurrentAmount(double currentAmount) { this.currentAmount = currentAmount; }    public double getAmount() { return amount; }    public void setAmount(double amount) { this.amount = amount; }    // 业务方法    public String opening(double opening) {        this.opening = opening;        this.currentAmount += opening; // 更新currentAmount        return "This account has been opened with " + this.opening;    }    public String deposit(double amount) {        this.currentAmount += amount; // 更新currentAmount        return "Depositing " + amount;    }    public String balance() {        return "Balance: " + currentAmount;    }}// DebitCard.javapublic class DebitCard extends BaseAccount {    public DebitCard(double opening, double currentAmount, double amount) {        super(opening, currentAmount, amount);    }    public String withdraw(double amount) {        // 问题所在:这里创建了一个局部变量currentAmount        double currentAmount = getCurrentAmount() - amount;         return amount + " have been retired. nBalance: " + currentAmount;    }}// Inheritance.java (主测试类)public class Inheritance {    public static void main(String[] args) {        BaseAccount base1 = new BaseAccount(0,0,0);        System.out.println(base1.opening(500));        System.out.println(base1.deposit(22.22));        System.out.println(base1.balance()); // 预期输出:Balance: 522.22        DebitCard debit1 = new DebitCard(0,0,0);        System.out.println(debit1.opening(400));        System.out.println(debit1.deposit(33.33));        System.out.println(debit1.balance()); // 预期输出:Balance: 433.33        System.out.println(debit1.withdraw(33.33)); // 预期输出:33.33 have been retired. nBalance: 400.0        System.out.println(debit1.balance()); // 实际输出:Balance: 433.33,而不是400.0    }}

运行上述代码,会发现DebitCard对象在执行withdraw操作后,其后续的balance()方法调用仍然返回取款前的余额。这表明withdraw方法并未成功修改BaseAccount中实际的currentAmount字段。

立即学习“Java免费学习笔记(深入)”;

根本原因:局部变量与实例字段的混淆

问题出在DebitCard类的withdraw方法中的这一行:double currentAmount = getCurrentAmount() – amount;

在这里,double currentAmount声明了一个新的局部变量,其名称恰好与父类中的实例字段currentAmount相同。当这行代码执行时,它计算了取款后的余额,并将结果赋给了这个局部变量。父类中的实例字段currentAmount从未被修改。因此,当再次调用debit1.balance()时,它仍然读取的是父类中未被更新的currentAmount值。

由于BaseAccount中的currentAmount字段是private的,子类DebitCard无法直接访问或修改它。正确的做法是利用BaseAccount提供的public方法setCurrentAmount()来更新该字段。

乾坤圈新媒体矩阵管家 乾坤圈新媒体矩阵管家

新媒体账号、门店矩阵智能管理系统

乾坤圈新媒体矩阵管家 17 查看详情 乾坤圈新媒体矩阵管家

解决方案:利用Setter方法更新继承状态

为了正确地更新父类的currentAmount字段,DebitCard的withdraw方法应该调用BaseAccount中定义的setCurrentAmount()方法。

修改后的DebitCard类如下:

// DebitCard.java (修正版)public class DebitCard extends BaseAccount {    public DebitCard(double opening, double currentAmount, double amount) {        super(opening, currentAmount, amount);    }    public String withdraw(double amount) {        // 正确做法:获取当前余额,计算新余额,然后通过setter方法更新父类的实例字段        double newAmount = getCurrentAmount() - amount;        setCurrentAmount(newAmount); // 使用父类的setter方法更新currentAmount字段        return amount + " have been retired. nBalance: " + newAmount;    }}

使用修正后的DebitCard类再次运行main方法,输出将是正确的:

This account has been opened with 500.0Depositing 22.22Balance: 522.22This account has been opened with 400.0Depositing 33.33Balance: 433.3333.33 have been retired. Balance: 400.0Balance: 400.0 // 正确更新后的余额

现在,debit1.balance()在withdraw之后正确地反映了取款后的余额。

注意事项与最佳实践

私有字段的封装性: private字段是Java封装性的体现。子类不能直接访问父类的private字段。必须通过父类提供的公共或受保护的访问器(getter/setter)方法来间接操作这些字段。避免局部变量遮蔽: 在子类方法中声明与父类实例字段同名的局部变量是一个常见的错误,它会“遮蔽”父类的实例字段,导致对局部变量的操作,而不是对实例字段的操作。字段的合理性: 在BaseAccount中,amount字段在构造函数中被初始化,但后续代码中从未被使用。对于不使用的字段,应考虑将其移除,以保持代码的简洁性和避免潜在的混淆。构造函数的设计: BaseAccount的构造函数接受opening、currentAmount和amount三个参数。通常,currentAmount可以由opening(初始开户金额)和后续的存取款操作计算得出,而不是作为一个独立的参数传入。amount字段的用途也值得商榷。一个更简洁的构造函数可能只接受opening,然后内部计算currentAmount。

总结

在Java继承体系中,子类对父类私有字段的修改必须通过父类提供的公共setter方法进行。直接在子类方法中创建同名的局部变量会导致对局部变量的操作,而无法影响父类的实例字段,从而造成数据不一致。理解并正确运用封装原则和访问器方法是编写健壮、可维护的Java代码的关键。同时,审视并优化类中的字段设计,移除不必要的字段,有助于提高代码质量。

以上就是Java继承中子类状态管理:正确更新父类私有字段的实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/302907.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
苹果手机如何开启语音播报通知
上一篇 2026年10月25日 17:20:29
大客户管理需求有哪些
下一篇 2025年11月16日 00:22:31

相关推荐

  • windows10如何让任务栏完全透明_Windows任务栏透明化视觉效果设置

    windows10如何让任务栏完全透明_Windows任务栏透明化视觉效果设置windows10如何让任务栏完全透明_Windows任务栏透明化视觉效果设置windows10如何让任务栏完全透明_Windows任务栏透明化视觉效果设置windows10如何让任务栏完全透明_Windows任务栏透明化视觉效果设置

    首先通过系统颜色设置开启透明效果,再通过注册表调整透明度,或使用TranslucentTB、Rainmeter等工具实现任务栏完全透明。 如果您希望让Windows 10的任务栏呈现透明效果,以提升桌面美观度和视觉体验,可以通过系统设置或第三方工具实现。默认情况下,任务栏为半透明毛玻璃效果,但未提供…

    2026年10月25日 • 用户投稿
    600
  • 九宫格卡牌构筑游戏《星陨传说:流浪者的故事》9月25日上线主机平台

    独立游戏工作室Slothwerks与发行商indienova今日宣布,广受好评的Roguelike卡牌构筑冒险游戏《星陨传说:流浪者的故事》(Meteorfall: Krumit’s Tale)将于2025年9月25日正式登陆Nintendo Switch及PlayStation 4/5平台,Nin…

    2026年10月25日
    000
  • 一直都在!《赛博朋克》原作者确认深度参与《赛博朋克2》开发

    一直都在!《赛博朋克》原作者确认深度参与《赛博朋克2》开发一直都在!《赛博朋克》原作者确认深度参与《赛博朋克2》开发一直都在!《赛博朋克》原作者确认深度参与《赛博朋克2》开发一直都在!《赛博朋克》原作者确认深度参与《赛博朋克2》开发

    《赛博朋克》系列的缔造者迈克·庞德史密斯近日亮相CD Projekt Red官方直播节目《REDstreams》的特别企划,分享了他在《赛博朋克2077》续作开发中的角色。他确认目前仍以顾问身份深度参与项目,主要负责世界观架构与设定指导。 庞德史密斯提到,由于自开发初期便已加入团队,使他能全程提供反…

    2026年10月25日 • 用户投稿
    000
  • 知网AIGC链接入口 免费官网检测直达

    知网AIGC链接入口 免费官网检测直达知网AIGC链接入口 免费官网检测直达知网AIGC链接入口 免费官网检测直达知网AIGC链接入口 免费官网检测直达

    知网AIGC检测官方入口为https://cx.cnki.net,唯一正规个人检测平台,需注册登录后付费检测,约2元/千字符,支持Word与PDF格式,检测后扫码支付可获取含高亮标注和AI特征值的详细报告,用于论文自查与内容优化。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用…

    2026年10月25日 • 用户投稿
    000
  • 免费PPT网站最新网址入口_免费PPT网站在线设计官网首页

    免费PPT网站最新网址入口_免费PPT网站在线设计官网首页免费PPT网站最新网址入口_免费PPT网站在线设计官网首页免费PPT网站最新网址入口_免费PPT网站在线设计官网首页免费PPT网站最新网址入口_免费PPT网站在线设计官网首页

    首选OfficePLUS和稻壳儿,微软与WPS官方平台模板多、更新快,免费资源丰富;优品PPT、51PPT模板网、第一PPT专注垂直分享,风格多样且免费实用;HiPPTer为导航站整合全网资源,boardmix支持AI生成与在线协作,满足高效编辑与团队需求。 想找免费又好用的PPT网站,直接收藏这几…

    2026年10月25日 • 用户投稿
    000
  • Spigot插件开发:防止重复破坏方块事件滥用的策略

    Spigot插件开发:防止重复破坏方块事件滥用的策略Spigot插件开发:防止重复破坏方块事件滥用的策略Spigot插件开发:防止重复破坏方块事件滥用的策略Spigot插件开发:防止重复破坏方块事件滥用的策略

    本文探讨了在spigot插件中,如何有效防止玩家通过重复放置和破坏方块来滥用事件触发机制的问题。核心解决方案是利用`hashset`来追踪已被破坏的方块位置,从而确保每个方块在特定事件中只被处理一次,避免了世界边界无限扩张等潜在漏洞。 在Spigot插件开发中,我们经常会遇到需要对玩家破坏特定方块的…

    2026年10月25日 • 用户投稿
    000
  • 防止重复挖掘:Spigot插件中检测方块是否已被破坏的方法

    防止重复挖掘:Spigot插件中检测方块是否已被破坏的方法防止重复挖掘:Spigot插件中检测方块是否已被破坏的方法防止重复挖掘:Spigot插件中检测方块是否已被破坏的方法防止重复挖掘:Spigot插件中检测方块是否已被破坏的方法

    本文针对Spigot插件开发中,如何防止玩家重复挖掘同一方块以触发特定事件的问题,提供了一种基于HashSet的解决方案。通过维护一个已破坏方块坐标的集合,插件可以高效地检测方块是否已被破坏,从而避免重复触发事件,例如扩展世界边界。同时,文章也讨论了该方案的内存占用问题,并给出了适用范围的建议。 在…

    2026年10月25日 • 用户投稿
    300
  • CPU单核性能在当今多任务环境下是否依然至关重要?

    单核性能对现代应用和游戏体验至关重要,因其直接影响程序响应速度与执行效率。尽管多线程技术普及,但浏览器渲染、游戏主循环等关键任务仍依赖单线程性能,无法完全并行化。老旧或优化不佳软件及为避免同步问题采用单线程模型的新应用,也高度依赖单核表现。评估时应参考Geekbench、Cinebench R23单…

    2026年10月25日
    000
  • 小鹏宣布11月5日举行科技日!Robotaxi即将亮相?

    小鹏宣布11月5日举行科技日!Robotaxi即将亮相?小鹏宣布11月5日举行科技日!Robotaxi即将亮相?小鹏宣布11月5日举行科技日!Robotaxi即将亮相?小鹏宣布11月5日举行科技日!Robotaxi即将亮相?

    10月30日,小鹏正式宣布“小鹏ai科技日”将于2025年11月5日举行,主题定为“涌现”(emergence)。“当技术的要素积累到某个临界点,过去那些孤立的技术难题,突然之间,贯通了。”何小鹏在官方公告中表示,小鹏在物理ai领域已涌现出惊喜的能力,“不止一个,而是多个”。 ☞☞☞AI 智能聊天,…

    2026年10月25日 • 用户投稿
    000
  • 系列史上最薄!华为Mate70 Air标配12GB内存:11月6日预售

    系列史上最薄!华为Mate70 Air标配12GB内存:11月6日预售系列史上最薄!华为Mate70 Air标配12GB内存:11月6日预售系列史上最薄!华为Mate70 Air标配12GB内存:11月6日预售系列史上最薄!华为Mate70 Air标配12GB内存:11月6日预售

    11月4日,华为mate70 air已进入发布倒计时。据数码博主“看山叔”透露,该机型将于11月6日正式开启预售,并于11月11日全面首销。 博主暗示华为Mate70 Air信息 在配置方面,新机将提供两种存储组合:12GB+256GB和12GB+512GB,全系标配12GB运行内存,性能表现值得期…

    2026年10月25日 • 用户投稿
    000
  • 修复Java剪刀石头布游戏中的循环逻辑与CPU出招错误

    修复Java剪刀石头布游戏中的循环逻辑与CPU出招错误修复Java剪刀石头布游戏中的循环逻辑与CPU出招错误修复Java剪刀石头布游戏中的循环逻辑与CPU出招错误修复Java剪刀石头布游戏中的循环逻辑与CPU出招错误

    本教程旨在解决java剪刀石头布游戏中两个关键问题:一是平局时游戏无限循环,因主方法未正确更新游戏状态布尔变量;二是cpu出招逻辑缺陷,导致剪刀永不出现。文章将详细分析问题根源,提供代码修正方案,并强调函数返回值利用和随机数生成的正确实践,以构建一个功能完善、逻辑清晰的游戏程序。 在开发Java剪刀…

    2026年10月25日 • 用户投稿
    200
  • windows怎么解决睡眠后无法唤醒_Windows睡眠唤醒问题解决方法

    windows怎么解决睡眠后无法唤醒_Windows睡眠唤醒问题解决方法windows怎么解决睡眠后无法唤醒_Windows睡眠唤醒问题解决方法windows怎么解决睡眠后无法唤醒_Windows睡眠唤醒问题解决方法windows怎么解决睡眠后无法唤醒_Windows睡眠唤醒问题解决方法

    首先检查并更新显卡与芯片组驱动,其次禁用快速启动功能,接着关闭PCI Express电源管理,再通过命令行重置ACPI唤醒权限,最后重建电源计划以解决睡眠后无法唤醒问题。 如果您在使用Windows电脑时遇到睡眠模式后无法唤醒的问题,可能是由于电源管理设置、驱动程序不兼容或系统服务异常导致的。此类问…

    2026年10月25日 • 用户投稿
    000
  • 如何在Java中实现线程安全的任务队列

    使用BlockingQueue或线程池实现线程安全任务队列,如LinkedBlockingQueue配合ExecutorService,确保任务添加与执行的原子性,避免数据竞争,推荐优先使用标准并发工具类以降低出错风险。 在Java中实现线程安全的任务队列,关键在于确保多个线程同时访问队列时不会引发…

    2026年10月25日
    100
  • 虚拟伴侣AI如何设置娱乐伴侣 虚拟伴侣AI休闲娱乐功能的优化教程

    虚拟伴侣AI如何设置娱乐伴侣 虚拟伴侣AI休闲娱乐功能的优化教程虚拟伴侣AI如何设置娱乐伴侣 虚拟伴侣AI休闲娱乐功能的优化教程虚拟伴侣AI如何设置娱乐伴侣 虚拟伴侣AI休闲娱乐功能的优化教程虚拟伴侣AI如何设置娱乐伴侣 虚拟伴侣AI休闲娱乐功能的优化教程

    启用娱乐模式可开启讲笑话、播放音乐等功能,需在设置中激活并完成初始化;2. 自定义兴趣标签能提升内容推荐精准度,建议勾选电影、音乐等至少三项偏好;3. 绑定Spotify、Netflix等平台账户后,AI可调用播放列表实现智能推荐;4. 激活情景模拟功能可创建咖啡馆聊天、露营观星等虚拟休闲场景,支持…

    2026年10月25日 • 用户投稿
    200
  • 解决JPA双向循环引用:Jackson注解的有效应用与最佳实践

    解决JPA双向循环引用:Jackson注解的有效应用与最佳实践解决JPA双向循环引用:Jackson注解的有效应用与最佳实践解决JPA双向循环引用:Jackson注解的有效应用与最佳实践解决JPA双向循环引用:Jackson注解的有效应用与最佳实践

    本文深入探讨jpa实体中双向循环引用导致无限递归的问题,特别是在%ignore_a_1%序列化场景下。我们将分析常见的解决方案,重点介绍`@jsonmanagedreference`和`@jsonbackreference`这对jackson注解如何协同工作,以优雅且语义正确的方式打破循环,确保数据…

    2026年10月25日 • 用户投稿
    100
  • 玩家流失严重!《使命召唤:黑色行动6》Steam周末Steam人数创新低

    玩家流失严重!《使命召唤:黑色行动6》Steam周末Steam人数创新低玩家流失严重!《使命召唤:黑色行动6》Steam周末Steam人数创新低玩家流失严重!《使命召唤:黑色行动6》Steam周末Steam人数创新低玩家流失严重!《使命召唤:黑色行动6》Steam周末Steam人数创新低

    近一年来,《使命召唤》的处境可谓举步维艰。自《黑色行动6》发布以来,关于游戏地图设计、微交易系统,以及备受争议的技术匹配机制的批评声不断,导致其在发售不到两个月内流失了高达50%的玩家——相比之下,《现代战争3》同期仅流失6%。期间,游戏还卷入了涉嫌使用生成式ai的舆论风波,玩家数量持续低迷,难以回…

    2026年10月25日 • 用户投稿
    100
  • 小红书商家入驻后登录_千帆PC端管理后台官网

    小红书商家入驻后登录千帆PC端管理后台官网为https://ark.xiaohongshu.com/app-system/home,该平台提供商品管理、订单处理、数据看板与营销工具等功能,支持多端协同、子账号权限分配及API对接,助力商家高效运营。 ai解答入口:“☞☞☞☞点击夸克ai手把手教你操作…

    2026年10月25日
    000
  • 解决JPA双向关联循环引用:Jackson注解的最佳实践

    解决JPA双向关联循环引用:Jackson注解的最佳实践解决JPA双向关联循环引用:Jackson注解的最佳实践解决JPA双向关联循环引用:Jackson注解的最佳实践解决JPA双向关联循环引用:Jackson注解的最佳实践

    本文旨在探讨并提供解决jpa双向关联在json序列化过程中引发的无限递归问题的最佳实践。我们将重点介绍如何利用jackson库提供的`@jsonmanagedreference`和`@jsonbackreference`注解,以语义正确且数据完整的方式打破循环引用,确保数据能够被正确地序列化和传输。…

    2026年10月25日 • 用户投稿
    000
  • 解决JPA双向循环引用:序列化无限递归的最佳实践

    解决JPA双向循环引用:序列化无限递归的最佳实践解决JPA双向循环引用:序列化无限递归的最佳实践解决JPA双向循环引用:序列化无限递归的最佳实践解决JPA双向循环引用:序列化无限递归的最佳实践

    本文旨在探讨并提供解决jpa双向循环引用导致序列化无限递归问题的最佳实践。我们将深入分析`@jsonmanagedreference`和`@jsonbackreference`这对注解的正确用法,并介绍数据传输对象(dtos)作为一种更灵活、更健壮的解决方案,以有效管理实体关系,避免数据冗余和性能问…

    2026年10月25日 • 用户投稿
    100
  • 腾讯朱雀AI检测官网 朱雀大模型检测平台在线体验入口

    腾讯朱雀AI检测官网 朱雀大模型检测平台在线体验入口腾讯朱雀AI检测官网 朱雀大模型检测平台在线体验入口腾讯朱雀AI检测官网 朱雀大模型检测平台在线体验入口腾讯朱雀AI检测官网 朱雀大模型检测平台在线体验入口

    腾讯朱雀AI检测官网入口为https://matrix.tencent.com/ai-detect,该平台支持文本、文档、图像和视频的AI生成内容检测,提供批量处理与分段标注功能,检测结果以概率形式呈现并标出可疑区域;使用时可选择对应模块上传内容,系统基于大规模数据训练模型快速生成报告,具备识别改写…

    2026年10月25日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信