Вопрос-ответ

Non-static variable cannot be referenced from a static context

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

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

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

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

Переведено автоматически
Ответ 1

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

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

Поэтому класс говорит "все автомобили имеют цвет", а экземпляр говорит "этот конкретный автомобиль красный".

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

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

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

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

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()).

Ответ 2

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

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

class Programm {

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

public void start() {
// can now access non-static fields
}
}
Ответ 3

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

Жизненный цикл класса, в общих чертах, это:


  1. исходный код для класса написан для создания шаблона, или паттерна, или штампа, который затем может быть использован для

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

  3. уничтожьте объект, восстановив ресурсы, которые он содержит, такие как память, во время сборки мусора.

Чтобы иметь начальную точку входа для приложения, Java приняла соглашение о том, что программа Java должна иметь класс, содержащий метод с согласованным или специальным именем. Этот специальный метод называется main(). Поскольку метод должен существовать независимо от того, был создан экземпляр класса, содержащего основной метод, или нет, main() метод должен быть объявлен с static модификатором, чтобы, как только класс загружен, main() метод был доступен.

В результате при запуске вашего Java-приложения с помощью командной строки, такой как java helloworld, происходит ряд действий. Прежде всего, запускается и инициализируется виртуальная машина Java. Далее helloworld.class файл, содержащий скомпилированный Java-код, загружается в виртуальную машину Java. Затем виртуальная машина Java ищет метод в helloworld классе, который вызывается main(String [] args). этот метод должен быть static таким, чтобы он существовал, даже если класс фактически не был создан как объект. Виртуальная машина Java не создает экземпляр класса путем создания объекта из класса. Она просто загружает класс и запускает выполнение с помощью main() метода.

Итак, вам нужно создать экземпляр вашего класса как объект, а затем вы сможете получить доступ к методам и переменным класса, которые не были объявлены с помощью модификатора static. После запуска вашей Java-программы с main() функцией вы можете использовать любые переменные или методы с модификатором static, поскольку они существуют как часть загружаемого класса.

Однако те переменные и методы класса, которые находятся вне main() метода и не имеют static модификатора, не могут использоваться до тех пор, пока экземпляр класса не будет создан как объект внутри main() метода. После создания объекта вы можете использовать переменные и методы объекта. Попытка использовать переменные и методы класса, которые не имеют модификатора static, без прохождения объекта класса перехватывается компилятором Java во время компиляции и помечается как ошибка.

import java.io.*;

class HelloWorld {
int myInt; // this is a class variable that is unique to each object
static int myInt2; // this is a class variable shared by all objects of this class

static void main (String [] args) {
// this is the main entry point for this Java application
System.out.println ("Hello, World\n");
myInt2 = 14; // able to access the static int
HelloWorld myWorld = new HelloWorld();
myWorld.myInt = 32; // able to access non-static through an object
}
}
Ответ 4

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

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 {
...
2024-02-28 08:41 java