Внутренние классы в Java - ошибка нестатической переменной

Я все еще новичок в Java, и я попытался создать внутренний класс и вызвать метод внутри main. Но есть ошибка компиляции: «Нестатическая переменная - на нее нельзя ссылаться из статического контекста»

Пожалуйста помоги

class Class1{

    public static void main(String args []){
        Class2 myObject = new Class2();
        myObject.newMethod();
    }

    public class Class2{
        public void newMethod(){
            System.out.println("Second class");
        }
    }
}

Ответы на вопрос(4)

добавив статическое ключевое слово как

public static class  Class2

тогда это должно работать. Вы не можете спрашивать что-либо статическое, что есть для каждого класса в нестатическом контексте. В качестве альтернативы вы можете получить к нему доступ, создав объект без превращения class2 в статический объект.

Решение Вопроса

внутренний классу нужна ссылка на экземплярвнешний класс для того, чтобы быть построенным. Если вашему классу это не нужно, используйтеstatic Модификатор, чтобы сделать его "просто вложенным классом":

    public void newMethod(){
        System.out.println("Second class");
    }
}

РЕДАКТИРОВАТЬ: Чтобы создать экземплярClass2 каквнутренний класс, вы можете использовать что-то вроде:

Class1 outer = new Class1();
Class2 myObject = outer.new Class2();

Или более кратко:

Class2 myObject = new Class1().new Class2();

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

 Peter Lawrey16 окт. 2012 г., 13:38
+1 Нестатический вложенный класс имеет неявную ссылку на свой внешний класс, и он не может быть создан без него.
 ŦhųLẩnå FệrñảnDö16 окт. 2012 г., 13:34
Спасибо, приятель :) очень ценю это ... не могли бы вы объяснить этот бит, пожалуйста "Внутренний класс нуждается в ссылке на экземпляр внешнего класса, чтобы быть сконструированным."

«main ()» не подходит для любой сложной логики. Вы не можете вызывать из него любой метод, который не является статическим в классе. «main ()» необходим только для запуска приложения,

Во многих случаях прежде всего вам необходимо создать экземпляр класса, который содержит метод «main». В примере это «OuterClass».

Когда существует экземпляр «OuterClass», у вас нет проблем с тем, чтобы вызывать из него что-нибудь динамическое, например, ваши методы InnerClass объекта InnerClass.

Вот пример:

public class OuterClass {
    public static void main(String args []){
        new OuterClass();   // Instance of First class
    }

    public OuterClass () { // constuctor
        InnerClass myObject = new InnerClass();
        myObject.newMethod();
    }

    public class InnerClass{
        public void newMethod(){
            System.out.println("Second class");
        }
    }

}

как и к любым другим обычным методам вашего класса.

Так же, как вам нужна ссылка наinstance вашего класса для доступа к его методу, аналогично вам нужна ссылка на экземпляр внешнего класса, чтобы создать экземпляр вашего внутреннего класса:

Class1.Class2 myObject = new Class1().new Class2();

Или же,альтернатива есть, вы можете сделать свой внутренний классstaticв этом случае это называетсяnested classТогда вы можете использовать свой оригинальный способ: -

public static class Class2{
    public void newMethod(){
        System.out.println("Second class");
    }
}

Ваш ответ на вопрос