如何解决Java静态方法引用非静态方法的编译报错问题?
编译报错问题梳理与修复
报错信息
编译阶段直接提示:non-static method reverse(String[]) cannot be referenced from a static context
存在问题的原始代码
public class Main { public static void Main(String[] args) { String [] arr = {"10", "20", "30", "40", "50"}; reverse(arr); } public String[] reverse(String[] arr) { for(int i=arr.length-1;i>=0;i--) System.out.print(arr[i] + " "); } }
错误触发原因
- 主方法属于静态上下文,静态成员由类本身持有,不依赖类的实例对象存在,不能直接调用非静态的实例成员
- 代码中定义的
reverse方法没有加static修饰,属于普通实例方法,必须依托类的实例对象才能被调用,在静态主方法中无对象直接调用就会触发上述编译错误 - 原始代码还存在两处隐藏问题,修正静态调用错误后依然会编译失败或无法正常运行:
- Java程序的主入口方法是全小写的
main,写成大写Main无法被JVM识别为程序启动入口 reverse方法声明了String[]返回值类型,但方法内部没有对应的返回逻辑,会触发「方法缺少返回值」的编译报错
- Java程序的主入口方法是全小写的
可行修复方案
- 方案一(适配当前简单实现场景):
给reverse方法加static修饰,使其成为静态方法,可直接在静态主方法中调用;同时将无返回需求的方法返回值从String[]改为void,把主方法名修正为小写main - 方案二(保留
reverse的实例方法属性):
在主方法中先创建Main类的实例对象,通过对象实例调用非静态的reverse方法,核心调用逻辑为:// 主方法内的调用代码 String[] arr = {"10", "20", "30", "40", "50"}; new Main().reverse(arr);
修复后可正常运行的示例代码
public class Main { // 修正主入口方法名为小写main public static void main(String[] args) { String [] arr = {"10", "20", "30", "40", "50"}; // 直接调用静态reverse方法 reverse(arr); } // 加static修饰匹配静态调用场景,修正返回值为void public static void reverse(String[] arr) { for(int i = arr.length - 1; i >= 0; i--) { System.out.print(arr[i] + " "); } } }
内容的提问来源于stack exchange,提问作者Ahmad Khan
相关产品推荐
相关产品推荐

