如何在重写方法中调用父类成员函数?替代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
相关产品推荐
相关产品推荐

