Нестатическая переменная, на которую нельзя ссылаться из статического контекста - почему здесь? - PullRequest
6 голосов
/ 26 ноября 2011

У меня есть код:

package why;

public class Foo
{
    public class Foo1
    {
        String bar;

        public Foo1(String bar)
        {
            this.bar = bar;
        }

        public static Foo1 MYCONSTANT = new Foo(null);
    }

}

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

Почему даже здесь?

public static Foo getMYCONSTANT()
{
    return new Foo(null, null);
}

Спасибо

Ответы [ 2 ]

6 голосов
/ 27 ноября 2011

Давайте посмотрим на этот пример:

public class MainClass {

  public class NonStaticClass {

    public static NonStaticClass nonStatic = new NonStaticClass();
    //Compile error: The field nonStatic cannot be declared static; 
    //static fields can only be declared in static or top level types
    public static int i = 10;//this field also causes the same compile error
  }

}

Проблема в том, что NonStaticClass, ну, не статично .Нестатический внутренний класс не может содержать статические поля.

Если вы хотите иметь статическое поле во внутреннем классе, вам нужно сделать класс статическим.

Из документации Java:

Внутренние классы

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

Для получения дополнительной информации см. Вложенные классы

1 голос
/ 26 ноября 2011

Я не уверен, что ваш настоящий вопрос ... но, возможно, это может помочь:

http://en.wikipedia.org/wiki/Singleton_pattern

Во втором издании его книги "Эффективная Java"«Джошуа Блох утверждает, что« одноэлементный тип перечисления является лучшим способом реализации синглтона »[9] для любой Java, которая поддерживает перечисления.Использование enum очень просто реализовать и не имеет недостатков в отношении сериализуемых объектов, которые необходимо обойти другими способами.

public enum Singleton {
        INSTANCE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...