Java中正确调用父类被重写方法的实现方式

发布时间 - 2026-01-09 00:00:00    点击率:

在java中,`this.print()`始终调用运行时对象的实际类型所对应的重写方法,无法直接通过`this`访问当前类声明的版本;若需调用父类中被重写的同名方法,必须显式使用`super.print()`——但仅限于**直接父类的同名方法**,且不能用于间接调用父类的其他方法(如`super.doprint()`中又调用`this.print()`仍会触发重写)。

你遇到的 StackOverflowError 根本原因在于 Java 的动态绑定(Dynamic Method Dispatch)机制:this.print() 永远解析为当前对象实际类型的 print() 实现,而非声明类型的。在你的示例中:

  • B b = new B(); b.doPrint(); → 调用 B.doPrint()
  • B.doPrint() 中执行 this.print() → 由于 this 是 B 实例,调用 B.print()
  • B.print() 中执行 super.doPrint() → 调用 A.doPrint()
  • A.doPrint() 中执行 this.print() → 再次调用 B.print()(因为 this 仍是 B 实例)

从而形成无限递归:B.print() → A.doPrint() → B.print() → …

✅ 正确解法:若目标是让 B.print() 行为等价于 “执行 A 类原始的 print() 输出”,应直接委托给 super.print(),而非通过 super.doPrint() 间接调用:

class A {
    public void doPrint() {
        this.print(); // 动态绑定:对 B 实例即调用 B.print()
    }

    public void print() {
        System.out.println("This is A");
    }
}

class B extends A {
    @Override
    public void doPrint() {
        this.print(); // 同样动态绑定 → B.print()
    }

    @Override
    public void print() {
        super.print(); // ✅ 关键修正:直接调用 A.print(),不经过 doPrint
    }
}

运行结果:

This is A

⚠️ 注意事项:

  • super.xxx() 只能调用直接父类中定义的方法(或字段),不能跳过父类调用祖父类;
  • super 不能用于静态上下文(如静态方法)、构造器外的 this 引用,也不能在 static 方法中使用;
  • 若需更灵活的控制流(例如 B 中想复用 A 的 doPrint 逻辑但绕过其 print() 重写),应重构设计:将可变行为抽取为模板方法(Template Method Pattern),例如:
class A {
    public final void doPrint() { // final 防止子类覆盖流程
        printImpl();
    }
    protected void printImpl() {
        System.out.println("This is A");
    }
}

class B extends A {
    @Override
    protected void printImpl() {
        System.out.println("This is B");
    }
}

这种设计明确分离了“算法骨架”与“可变行为”,避免了调用链歧义,是 Java 中更健壮、符合面向对象原则的实践方式。


# java  # overflow 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高防服务器如何保障网站安全无虞?  如何在云服务器上快速搭建个人网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  微信小程序 wx.uploadFile无法上传解决办法  微信公众帐号开发教程之图文消息全攻略  如何在服务器上三步完成建站并提升流量?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  微信小程序 canvas开发实例及注意事项  Laravel如何实现API资源集合?(Resource Collection教程)  linux top下的 minerd 木马清除方法  Android中AutoCompleteTextView自动提示  高防服务器租用指南:配置选择与快速部署攻略  三星网站视频制作教程下载,三星w23网页如何全屏?  移动端脚本框架Hammer.js  黑客如何利用漏洞与弱口令入侵网站服务器?  如何快速生成凡客建站的专业级图册?  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何彻底卸载建站之星软件?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何撰写建站申请书?关键要点有哪些?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  *服务器网站为何频现安全漏洞?  大型企业网站制作流程,做网站需要注册公司吗?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何快速搭建支持数据库操作的智能建站平台?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  如何用好域名打造高点击率的自主建站?  如何用AWS免费套餐快速搭建高效网站?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  如何用已有域名快速搭建网站?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  北京企业网站设计制作公司,北京铁路集团官方网站?  在线制作视频网站免费,都有哪些好的动漫网站?  EditPlus中的正则表达式 实战(1)  再谈Python中的字符串与字符编码(推荐)  LinuxShell函数封装方法_脚本复用设计思路【教程】  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  如何用腾讯建站主机快速创建免费网站?  Laravel如何处理异常和错误?(Handler示例)  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何选择PHP开源工具快速搭建网站?  魔方云NAT建站如何实现端口转发?  C语言设计一个闪闪的圣诞树