На нестатическую переменную нельзя ссылаться из статического контекста - PullRequest
255 голосов
/ 01 апреля 2010

Я написал этот тестовый код:

class MyProgram
{
    int count = 0;
    public static void main(String[] args)
    {
        System.out.println(count);
    }
}

Но выдает следующую ошибку:

Main.java:6: error: non-static variable count cannot be referenced from a static context
        System.out.println(count);
                           ^

Как мне заставить мои методы распознавать переменные класса?

Ответы [ 12 ]

1 голос
/ 07 июня 2017

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

| * | Статические: Статические элементы могут вызываться с именем класса
Если вы наблюдаете в кодах, некоторые функции напрямую вызываются с именами классов, например

NamCls.NamFnc();

System.out.println();

Это потому, что NamFnc и println будут объявлены с использованием ключевого слова static перед ними.

| * | Нестатические: Нестатические элементы можно вызывать с помощью переменной класса
Если это не статично, вам нужна переменная класса
поставить точку после переменной класса и
затем вызовите функцию.

NamCls NamObjVar = new NamCls();
NamObjVar.NamFnc();


Ниже код объясняет вам аккуратно

| * | Статическая и нестатическая функция в классе:

public class NamCls
{
    public static void main(String[] args)
    {
        PlsPrnFnc("Tst Txt");

        NamCls NamObjVar = new NamCls();
        NamObjVar.PrnFnc("Tst Txt");
    }

    static void PlsPrnFnc(String SrgPsgVal)
    {
        System.out.println(SrgPsgVal);
    }

    void PrnFnc(String SrgPsgVal)
    {
        System.out.println(SrgPsgVal);
    }
}


| * | Статический и нестатический класс внутри класса:
public class NamCls
{
    public static void main(String[] args)
    {
        NamTicCls NamTicVaj = new NamTicCls();
        NamTicVaj.PrnFnc("Tst Txt");

        NamCls NamObjVar = new NamCls();
        NamNicCls NamNicVar = NamObjVar.new NamNicCls();
        NamNicVar.PrnFnc("Tst Txt");
    }

    static class NamTicCls
    {
        void PrnFnc(String SrgPsgVal)
        {
            System.out.println(SrgPsgVal);
        }
    }

    class NamNicCls
    {
        void PrnFnc(String SrgPsgVal)
        {
            System.out.println(SrgPsgVal);
        }
    }
}
0 голосов
/ 03 сентября 2015

За загрузку файлов классов отвечает ClassLoader. Посмотрим, что произойдет, когда мы напишем наши собственные классы.

Пример 1:

class StaticTest {

      static int a;
      int b;
      int c;
}

Теперь мы можем видеть, что класс "StaticTest" имеет 3 поля. Но на самом деле нет переменной-члена b, c. ОК, дабы увидеть. Здесь b, c - переменная экземпляра. Поскольку переменная экземпляра получает память во время создания объекта. Так что здесь b, c еще не получают никакой памяти. Вот почему не существует б, в. Так что существует только существование. Для ClassLoader у него есть только одна информация о. ClassLoader пока не распознает b, c, потому что объект еще не создан.

Давайте посмотрим на другой пример: Пример 2:

class StaticTest {

      public void display() {
          System.out.println("Static Test");
      }


      public static void main(String []cmd) {

             display();       
      }

}

Теперь, если мы попытаемся скомпилировать этот код, компилятор выдаст ошибку CE. CE: на нестатический метод display () нельзя ссылаться из статического контекста.

Теперь для ClassLoader это выглядит так:

class StaticTest {

      public static void main(String []cmd) {

             display();       
      }

}

В примере 2 ошибка CE связана с тем, что мы вызываем нестатический метод из статического контекста. Поэтому ClassLoader не может распознать метод display () во время компиляции. Так что произошла ошибка во время компиляции.

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