Java如何正确将主方法数组传入类构造器?编译错误求助
解决"non-static variable this cannot be referenced from a static context"错误
你碰到的这个编译错误其实很常见,核心问题出在非静态内部类的创建规则上。
你的代码里,Foo是Test类的非静态内部类——这种内部类的实例必须依附于外部类Test的实例才能存在。但main方法是静态的,静态上下文属于类本身,而非某个具体的实例,所以在main里直接new Foo(userInput)时,编译器找不到对应的外部类实例(也就是报错里的this),自然就报错了。
这里给你两种简单的解决方法:
方法一:把内部类改为静态内部类
如果你的Foo类不需要访问外部类Test的非静态成员,最直接的方式就是给Foo加上static修饰符,让它变成静态内部类。静态内部类不依赖外部类实例,静态方法里可以直接创建它的对象:
public class Test { static class Foo { // 这里添加static修饰符 int[] arr; Foo(int[] userInput) { arr = userInput; } } public static void main(String[] args) { int[] userInput = new int[]{1,2,3,4,5}; Foo instance = new Foo(userInput); // 现在可以正常创建实例 } }
方法二:先创建外部类实例,再通过实例创建内部类
如果Foo必须是非静态内部类(比如需要访问Test的非静态成员),那你得先创建Test的实例,再通过这个实例来创建Foo:
public class Test { class Foo { int[] arr; Foo(int[] userInput) { arr = userInput; } } public static void main(String[] args) { int[] userInput = new int[]{1,2,3,4,5}; Test testInstance = new Test(); // 先创建外部类实例 Foo instance = testInstance.new Foo(userInput); // 通过外部类实例创建内部类 } }
简单总结一下:非静态内部类和外部类实例绑定,静态上下文里没有外部实例,所以要么把内部类改成静态的,要么先造外部实例再用它造内部类。
内容的提问来源于stack exchange,提问作者DoubleX
相关产品推荐
相关产品推荐

