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

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

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);
                           ^

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

269
задан Dukeling 15 August 2017 в 10:14
поделиться

5 ответов

Для доступа к ним из ваших статических методов они должны быть статическими переменными-членами, например:

public class MyProgram7 {
  static Scanner scan = new Scanner(System.in);
  static int compareCount = 0;
  static int low = 0;
  static int high = 0;
  static int mid = 0;  
  static int key = 0;  
  static Scanner temp;  
  static int[]list;  
  static String menu, outputString;  
  static int option = 1;  
  static boolean found = false;

  public static void main (String[]args) throws IOException {
  ...
8
ответ дан 23 November 2019 в 02:21
поделиться

Я попытаюсь объяснить вам, что такое статические переменные. Прежде всего, статические переменные не принадлежат какому-либо конкретному экземпляру класса. Они распознаются по имени класса. Статические методы также не принадлежат какому-либо конкретному экземпляру. Они могут обращаться только к статическим переменным. Представьте, что вы вызываете MyClass.myMethod() и myMethod является статическим методом. Если вы используете нестатические переменные внутри метода, как, черт возьми, он узнает, какие переменные использовать? Вот почему вы можете использовать из статических методов только статические переменные. Повторяю еще раз, они НЕ принадлежат какому-либо конкретному экземпляру.

4
ответ дан 23 November 2019 в 02:21
поделиться

Статические поля и методы связаны с самим классом, а не с его экземплярами. Если у вас есть класс A , «нормальный» метод b и статический метод c , и вы создаете экземпляр a вашего класса A , вызовы Ac () и ab () действительны. Метод c () не знает, какой экземпляр подключен, поэтому он не может использовать нестатические поля.

Решение для вас состоит в том, что вы либо делаете свои поля статическими, либо ваши методы нестатичными. Тогда вы можете выглядеть так:

class Programm {

    public static void main(String[] args) {
        Programm programm = new Programm();
        programm.start();
    }

    public void start() {
        // can now access non-static fields
    }
}
79
ответ дан 23 November 2019 в 02:21
поделиться
  • Прежде всего, нужно знать разницу между экземпляром класса и самим классом. Класс моделирует определенные свойства и поведение в целом в контексте этих свойств. Экземпляр будет определять конкретные значения для этих свойств.

  • Все, что связано с ключевым словом static, доступно в контексте класса, а не в контексте экземпляра класса

  • Как следствие вышеупомянутых

    1. , переменные внутри метода не могут быть статическими
    2. статические поля, а методы должны вызываться с использованием имени класса, например MyProgram7.main (...)
  • Время жизни статического поля / метода эквивалентно времени жизни вашего приложения

Например. Скажем, автомобиль имеет свойство color и демонстрирует поведение "движение". Примером автомобиля может быть красный Volkswagen Beetle, движущийся со скоростью 25 км / ч.

Теперь статическим свойством автомобиля будет количество колес (4) на дороге, и это будет применяться ко всем автомобилям.

HTH

2
ответ дан 23 November 2019 в 02:21
поделиться

Вы должны понимать разницу между классом и экземпляром этого класса. Если вы видите машину на улице, вы сразу понимаете, что это машина, даже если вы не видите, какой модели или типа. Это потому, что вы сравниваете то, что видите, с "автомобилем" класса . Класс содержит, что аналогично всем автомобилям. Думайте об этом как о шаблоне или идее.

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

Итак, класс говорит: «Все машины имеют цвет», а экземпляр говорит: «Эта конкретная машина красная».

В объектно-ориентированном мире вы определяете класс, а внутри класса вы определяете поле типа Color . Когда создается экземпляр класса (когда вы создаете конкретный экземпляр), память резервируется для цвета, и вы можете присвоить этому конкретному экземпляру цвет. Поскольку эти атрибуты специфичны, они нестатичны.

Статические поля и методы используются всеми экземплярами. Они предназначены для значений, специфичных для класса, а не для конкретного экземпляра. Для методов это обычно глобальные вспомогательные методы (например, Integer.parseInt () ). Для полей это обычно константы (например, типы автомобилей, то есть что-то, где у вас есть ограниченный набор, который не часто меняется).

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

В вашем случае попробуйте этот код в качестве начального блока:

public static void main (String[] args)
{
    try
    {
        MyProgram7 obj = new MyProgram7 ();
        obj.run (args);
    }
    catch (Exception e)
    {
        e.printStackTrace ();
    }
}

// instance variables here

public void run (String[] args) throws Exception
{
    // put your code here
}

Новый метод main () создает экземпляр класса, который он содержит (звучит странно, но поскольку main () создается с классом, а не с экземпляром, он может это сделать), а затем вызывает метод экземпляра ( run () ).

275
ответ дан 23 November 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: