java如何正确地将主数组传递给类构造函数?

时间:2018-04-08 11:19:35

标签: java memory

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获得了地址值。

这就是我的理解,我错了吗?

2 个答案:

答案 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”?