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
相关产品推荐
相关产品推荐

