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

如何通过对象显式调用父类被重写的方法?(期望输出"hello B")

嘿,这个问题在面向对象编程里太常见啦!当子类重写了父类的方法后,默认调用的确实是子类的实现,但要显式调用父类被重写的方法,其实有几种简单的方式,我用Java来给你举例子说明,毕竟这是这类问题最典型的场景:

核心方案:使用super关键字(子类内部调用)

在子类的方法中,你可以直接用super.被重写的方法名()来调用父类的原始实现。比如我们先定义父类B和子类A:

// 父类B
class B {
    public void sayHello() {
        System.out.println("hello B"); // 你期望的输出
    }
}

// 子类A,重写了sayHello方法
class A extends B {
    @Override
    public void sayHello() {
        System.out.println("hello A"); // 默认调用的子类实现
    }

    // 封装一个方法,专门调用父类的sayHello
    public void callParentSayHello() {
        super.sayHello(); // 这里就是关键!用super调用父类被重写的方法
    }
}

然后在主程序中调用:

public class Main {
    public static void main(String[] args) {
        A a = new A();
        a.callParentSayHello(); // 执行后会输出 "hello B"
    }
}

额外场景:子类重写方法中同时调用父类逻辑

如果你的需求是在子类的重写方法里,先执行父类的逻辑再添加自己的逻辑,也可以直接用super:

@Override
public void sayHello() {
    super.sayHello(); // 先输出"hello B"
    System.out.println("hello A"); // 再输出子类自己的内容
}

进阶方式:反射(不推荐日常使用)

如果实在需要在子类外部直接调用父类的被重写方法(不通过子类封装的方法),可以用反射,但这种方式会破坏封装性,一般只在特殊场景下使用:

import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        A a = new A();
        try {
            // 获取父类B的sayHello方法
            Method parentMethod = B.class.getDeclaredMethod("sayHello");
            parentMethod.invoke(a); // 调用该方法,输出"hello B"
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结一下,日常开发里最推荐的就是用super关键字的方式,既规范又易维护,完全能满足你输出"hello B"的需求~

内容的提问来源于stack exchange,提问作者Abhijeet Ohol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:37:01