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};
Foo instance = new Foo(userInput);
}
}
它给了我一个错误
error: non-static variable this cannot be referenced from a static context
我已经搜索了一些答案,但无法解决。
以下是我对此代码的看法,我将userInput
视为指针,编译器分配5个int
内存,并为userInput分配address
,然后传输此地址(我知道java是pass by value
}到类Foo
构造函数,我认为instance
字段arr
获得了地址值。
这就是我的理解,我错了吗?
答案 0 :(得分:3)
由于类Foo
是类Test
的非静态内部类,因此如果没有Foo
的实例,则类Test
的实例不可能存在。因此,将Foo
更改为static
:
static class Foo {
int[] arr;
Foo(int[] userInput) {
arr = userInput;
}
}
或者如果您不想让它static
,请通过Foo
的实例更改您创建Test
实例的方式:
Foo instance = new Test().new Foo(userInput);
答案 1 :(得分:2)
当实例化非静态嵌套类(即Foo
)时,例如new Foo(userInput)
,它们需要存储对其封闭类的this
变量的隐式引用(即Test
)。由于Foo
是在静态main
方法的上下文中实例化的,因此没有封闭Test
的此类实例可用。因此,抛出错误。解决此问题的方法是使嵌套类Foo
保持静态,如:
public class Test {
static class Foo { // <---- Notice the static class
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);
}
}
有关详细信息,请参阅Nested Classes文档和Why do I get “non-static variable this cannot be referenced from a static context”?