Подтвердить что ты не робот

Почему я получаю "нестатистическую переменную, на которую нельзя ссылаться из статического контекста"?

У меня очень простой класс, который я хочу использовать в качестве подкласса другого. Но когда я помещаю его код в родительский класс, я получаю:

нестатическая переменная, на которую нельзя ссылаться из статического контекста

С другой стороны, когда я помещаю код класса sublass GenTest вне кода класса "parent" - JavaApp1, я не получаю эту ошибку.

public class JavaApp1 {

    class GenTest {  
        @Deprecated
        void oldFunction() {
            System.out.println("don't use that");
        }
        void newFunction() {
            System.out.println("That ok.");
        }
    }

    public static void main(String[] args) {
        GenTest x = new GenTest();
        x.oldFunction();
        x.newFunction();
    }
}

Почему это происходит?

4b9b3361

Ответ 1

Ваш вложенный класс (который не является подклассом, кстати) не помечен как статический, поэтому он является внутренним классом, для которого требуется экземпляр класса кодирования (JavaApp1).

Параметры:

  • Сделать вложенный класс статическим
  • Сделать это не внутренним классом (т.е. не внутри JavaApp1 вообще)
  • Создайте экземпляр JavaApp1 как "охватывающий экземпляр":

    GenTest x = new JavaApp1().new GenTest();
    

Лично я бы пошел со вторым подходом - вложенные классы в Java имеют несколько странностей вокруг них, поэтому я бы использовал классы верхнего уровня, если у вас нет веских оснований сделать его вложенным. (Окончательный вариант особенно беспорядочен, ИМО.)

Подробнее о внутренних классах см. раздел 8.1.3 JLS.

Ответ 2

Он должен быть static class GenTest, поскольку вы создаете его экземпляр из статического метода.

Кроме того, в общем случае внутренние классы должны быть статическими.

Ответ 3

Класс GenTest является нестатическим классом и поэтому должен быть создан в экземпляре JavaApp1. Если вы выполняете static class GenTest то, что у вас есть, в противном случае вам нужно создать экземпляр JavaApp1 и создать GenTest в нестационарном методе.

Ответ 4

Thar, потому что GenTest определяется с учетом контекста JavaApp1. Поэтому вы можете ссылаться на него, если у вас нет экземпляра JavaApp1. Измените его на static class, чтобы он работал.

static class GenTest...

Ответ 5

Используйте

static class GenTest()......

Ответ 6

То, как вы вызываете, - это не правильный способ сделать это. Поскольку внутренний класс GenTest является членом JavaApp1, правильный способ его вызова будет

GenTest x = new JavaApp1().new GenTest();

Используя его, ваш класс будет правильно компилироваться.

Ответ 7

Класс вложен, что означает, что ваш вложенный класс не является статичным, что означает, что вы должны создать объект для вложенного класса через объект основного класса. это означает, что ваш psvm должен быть таким.

public static void main(String[] args) {
    JavaApp1 a=new JavaApp1(); //create an object for the main class
    JavaApp1.GenTest x=a.new GenTest();

    x.oldFunction();
    x.newFunction();
}