java, как правильно передать основной массив в конструктор класса? [дубликат]

avatar
DoubleX
8 апреля 2018 в 11:19
32
2
0
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 как указатель, и компилятор выделяет пять int памяти и назначает userInput address, затем я передаю этот адрес (я знаю, что java pass by value) в конструктор класса Foo, и я думаю, что поле instance arr получило значение адреса.

Я так понимаю, я ошибаюсь?

Источник

Ответы (2)

avatar
Justin Albano
8 апреля 2018 в 11:29
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);
    }
}

Для получения дополнительной информации см. документацию Вложенные классы и Почему я получаю «нестатическую переменную, на которую нельзя ссылаться из статического контекста»?

avatar
STaefi
8 апреля 2018 в 11:30
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);