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

Java中如何从子类静态方法调用父类被重写的方法

问题解析与解决方案

你遇到的错误Cannot use super in a static context,原因很直接:super关键字只能在非静态实例方法中使用——它指向当前对象实例的父类部分,但静态方法属于类本身,不关联任何具体对象实例,所以根本没法用super。

下面是几种可行的解决办法:


方法1:直接创建父类实例调用

既然父类的display是非静态方法,最简单的方式就是直接创建父类对象来调用它:

class TakeMe{
    void display(){
        System.out.println("In super");
    }
}

public class Inher extends TakeMe{
    void display(){
        System.out.println("In child");
    }
    public static void main(String[] args) {
        TakeMe parentObj = new TakeMe();
        parentObj.display(); // 输出:In super
    }
}

方法2:封装非静态方法间接调用

如果需要基于子类实例来调用父类的被重写方法,可以在子类里封装一个非静态方法,用super调用父类逻辑,再在静态方法里通过子类实例触发这个方法:

class TakeMe{
    void display(){
        System.out.println("In super");
    }
}

public class Inher extends TakeMe{
    void display(){
        System.out.println("In child");
    }

    // 封装调用父类方法的逻辑
    void callSuperDisplay() {
        super.display();
    }

    public static void main(String[] args) {
        Inher childObj = new Inher();
        childObj.callSuperDisplay(); // 输出:In super
    }
}

方法3:反射调用(不推荐,仅特殊场景使用)

如果不想额外写方法或创建父类实例,可以用反射直接调用父类的方法,但这种方式可读性差,日常开发不建议使用:

import java.lang.reflect.Method;

class TakeMe{
    void display(){
        System.out.println("In super");
    }
}

public class Inher extends TakeMe{
    void display(){
        System.out.println("In child");
    }

    public static void main(String[] args) throws Exception {
        Inher childObj = new Inher();
        // 获取父类的display方法
        Method superDisplay = TakeMe.class.getDeclaredMethod("display");
        // 传入子类实例执行父类方法
        superDisplay.invoke(childObj); // 输出:In super
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:22:39