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

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

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

С другой стороны, когда я помещаю GenTest classа подclassа GenTest вне кода classа «родительский» – JavaApp1 я не получаю эту ошибку.

 public class JavaApp1 { class GenTest { @Deprecated void oldFunction() { System.out.println("don't use that"); } void newFunction() { System.out.println("That's ok."); } } public static void main(String[] args) { GenTest x = new GenTest(); x.oldFunction(); x.newFunction(); } } 

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

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

    Опции:

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

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

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

    См. Раздел 8.1.3 JLS для получения дополнительной информации о внутренних classах.

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

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

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

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

    static class GenTest...

    Пожалуйста, используйте

     static class GenTest()...... 

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

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

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

    Класс вложен, что означает, что ваш вложенный class не является статичным, что означает, что вы должны создать объект для вложенного classа через объект основного classа. это означает, что ваш 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(); } 
     class Test { static class GenTest { // nested class with static static void oldFunction() { // static method System.out.println("don't use that"); } void newFunction() { // non-static method System.out.println("That's ok."); } } public static void main (String[] args) { GenTest.oldFunction(); // call static method GenTest two = new GenTest(); // call non-static method two.newFunction(); } } 

    Java Java java

    Давайте будем гением компьютера.