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

如何通过派生类对象调用抽象类Base中的fun方法?

如何通过派生类对象调用抽象类中的fun方法

没问题,我来帮你搞定这个问题~你当前的代码里,Derived类重写了Base的fun()方法,所以直接用Derived实例调用fun()时,默认会执行子类的实现。要调用抽象类Base中的fun()方法,你可以试试下面几种方法:

方法1:在子类内部用super关键字调用

如果你想在Derived的方法里触发Base的fun(),直接用super.fun()就可以,这是Java里调用父类重写方法的标准方式。修改后的Derived类如下:

class Derived extends Base {
    void fun(){
        // 先调用Base类的fun方法
        super.fun();
        System.out.println("Derived fun() called");
    }
}

当你执行new Derived().fun()时,会先打印Base fun() called,再输出子类的内容。

方法2:用反射机制直接调用Base类的fun方法

如果想在外部代码里直接调用Base的fun()(不依赖子类内部的super调用),可以用Java反射绕过动态绑定:

public class Main {
    public static void main(String[] args) throws Exception {
        Derived d = new Derived();
        // 获取Base类中声明的fun方法
        java.lang.reflect.Method baseFunMethod = Base.class.getDeclaredMethod("fun");
        // 调用该方法,传入Derived实例对象
        baseFunMethod.invoke(d);
    }
}

这段代码执行后会直接打印Base fun() called,因为反射明确指定了调用Base类的方法,不受子类重写的影响。

额外补充:调用最顶层父类A的fun方法

如果之后你还需要调用A类的fun(),Java不允许直接写super.super.fun(),但可以在Base类里封装一个方法:

abstract class Base extends A {
    void fun(){ System.out.println("Base fun() called"); }
    
    // 封装调用A类fun的方法
    void callAFun() {
        super.fun(); // 这里的super指向A类
    }
}

然后在Derived里调用super.callAFun(),或者直接用new Derived().callAFun(),就能触发A类的fun()了。

原理说明

Java的方法调用是动态绑定的,程序会根据对象的实际类型(而不是声明类型)来选择执行哪个版本的方法。所以默认情况下,Derived实例调用fun()会执行子类的实现。而super关键字或者反射,都是用来绕过动态绑定,直接调用父类的方法实现。

内容的提问来源于stack exchange,提问作者Ganesh Chowdhary Sadanala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:16:48