You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在重写方法中调用父类成员函数?替代super.draw()的方案

问题解答

一、重写方法中调用父类成员函数的其他方式

在Java中,重写非静态成员方法时,常规且推荐的方式就是使用super.方法名(),除此之外还有两种非常规手段,不建议在生产代码中使用:

  • 通过反射调用:借助反射API获取父类的方法对象,再执行调用,示例代码如下:
import java.lang.reflect.Method;

class derived extends base {
    void draw() {
        try {
            Method drawMethod = base.class.getDeclaredMethod("draw");
            drawMethod.invoke(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 针对父类静态方法:可直接通过父类类名.方法名()调用(比如base.draw()),但静态方法属于类级别,不存在多态重写的概念,只是直接调用父类的静态逻辑。

二、让普通成员方法自动调用父类对应方法的实现

Java中构造函数会自动调用父类无参构造(子类构造未显式指定时),但普通成员方法没有这种默认机制,要实现类似效果,可通过以下两种方式:

1. 模板方法模式(推荐)

在父类中定义一个不可被重写的模板方法,先执行父类自身的逻辑,再调用抽象方法让子类实现具体业务;子类只需专注实现抽象方法,无需手动调用父类方法。示例:

abstract class base {
    // 模板方法,禁止子类重写
    public final void draw() {
        // 父类固定逻辑
        System.out.println("父类draw逻辑执行");
        // 调用子类的自定义逻辑
        doCustomDraw();
    }

    // 抽象方法,子类实现具体业务
    protected abstract void doCustomDraw();
}

class derived extends base {
    @Override
    protected void doCustomDraw() {
        // 子类自己的业务逻辑
        System.out.println("子类自定义draw逻辑执行");
    }
}

调用new derived().draw()时,会自动先执行父类的逻辑,再执行子类的自定义逻辑。

2. 编码规范约定(简单直接)

如果不想引入设计模式,只能在子类重写的方法开头手动调用super.draw(),就像你提供的代码示例那样。这种方式依赖团队编码规范约束,确保每次重写父类方法时都主动触发父类逻辑。

内容的提问来源于stack exchange,提问作者harmon cleary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:50:34