Я написал этот тестовый код:
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);
^
Как мне заставить мои методы распознавать переменные класса?
C
. Но это будет не очень хорошо. Попробуйте использовать Java так, как он предназначен для использования в качестве объектно-ориентированного языка.Ответы:
Вы должны понимать разницу между классом и экземпляром этого класса. Если вы видите автомобиль на улице, вы сразу же знаете, что это автомобиль, даже если вы не видите, какую модель или тип. Это потому, что вы сравниваете то, что видите, с классом «машина». Класс содержит который похож на все автомобили. Думайте об этом как шаблон или идея.
В то же время, автомобиль, который вы видите, является экземпляром класса «автомобиль», поскольку он обладает всеми ожидаемыми свойствами: кто-то за рулем, у него есть двигатель, колеса.
Таким образом, класс говорит, что «все автомобили имеют цвет», а экземпляр говорит, что «этот конкретный автомобиль красный».
В ОО-мире вы определяете класс, а внутри класса вы определяете поле типа
Color
. Когда создается экземпляр класса (когда вы создаете конкретный экземпляр), память зарезервирована для цвета, и вы можете дать этому конкретному экземпляру цвет. Поскольку эти атрибуты являются специфическими, они не являются статичными.Статические поля и методы являются общими для всех экземпляров. Они предназначены для значений, специфичных для класса, а не для конкретного экземпляра. Для методов это обычно глобальные вспомогательные методы (например
Integer.parseInt()
). Для полей это обычно константы (например, типы автомобилей, то есть то, где у вас есть ограниченный набор, который меняется не часто).Чтобы решить вашу проблему, вам нужно создать экземпляр (создать объект) вашего класса, чтобы среда выполнения могла зарезервировать память для этого экземпляра (в противном случае разные экземпляры будут перезаписывать друг друга, что вам не нужно).
В вашем случае попробуйте этот код как начальный блок:
Новый
main()
метод создает экземпляр класса, который он содержит (звучит странно, но посколькуmain()
он создается с классом, а не с экземпляром, он может это сделать), а затем вызывает метод экземпляра (run()
).источник
Статические поля и методы связаны с самим классом, а не с его экземплярами. Если у вас есть класс
A
, «нормальный» методb
и статический методc
, и вы создаете экземплярa
своего классаA
, вызовыA.c()
иa.b()
допустимы. Методc()
не знает, какой экземпляр подключен, поэтому он не может использовать нестатические поля.Решением для вас является то, что вы либо делаете свои поля статическими, либо ваши методы нестатичными. Вы могли бы выглядеть следующим образом:
источник
static
Ключевое слово изменяет жизненный цикл метода или переменной в классе.static
Метод или переменная создается во время загружен класс. Метод или переменная, которая не объявлена какstatic
, создается, только когда экземпляр класса создается как объект, например, с помощьюnew
оператора.Жизненный цикл класса в широком смысле:
new
оператором, используя класс, чтобы сделать экземпляр класса в качестве фактического объекта, а затем, когда это будет сделано с объектомЧтобы иметь начальную точку входа для приложения, Java приняла соглашение, что программа Java должна иметь класс, который содержит метод с согласованным или специальным именем. Этот специальный метод называется
main()
. Поскольку метод должен существовать независимо от того, был ли создан экземпляр класса, содержащего метод 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 во время компиляции и помечается как ошибка.источник
Давайте сначала проанализируем вашу программу ... В вашей программе ваш первый метод -
main()
и имейте в виду, что это статический метод ... Затем вы объявляете локальную переменную для этого метода (compareCount, low, high и т. Д.). Область действия этой переменной - только объявленный метод, независимо от того, является ли он статическим или нестатическим методом. Таким образом, вы не можете использовать эти переменные вне этого метода. Это основная ошибка, которую вы сделали.Тогда мы подходим к следующему пункту. Вы сказали, что static убивает вас. (Это может убить вас, но это только оживит вашу программу !!) Сначала вы должны понять основную вещь. * Статический метод вызывает только статический метод и использует только статическую переменную. * Статическая переменная или статический метод не зависят ни от одного экземпляра этого класса. (т.е. если вы измените какое-либо состояние статической переменной, оно будет отражаться во всех объектах класса). * Из-за этого вы называете его как переменную класса или метод класса. И еще много о ключевом слове "static". Я надеюсь, теперь вы поняли идею. Сначала измените область действия переменной и объявите ее как статическую (чтобы иметь возможность использовать ее в статических методах).
И совет для вас: вы неправильно поняли идею области действия переменных и статических функций. Получить четкое представление об этом.
источник
Самая базовая вещь - это статические переменные или статические методы на уровне класса. Переменные или методы уровня класса загружаются до методов или переменных уровня экземпляра. И очевидно, что вещь, которая не загружена, не может быть использована. Так что компилятор Java, не позволяющий обрабатывать вещи во время выполнения, разрешается во время компиляции. Вот почему это дает вам ошибку, нестатические вещи нельзя ссылаться из статического контекста. Вам просто нужно прочитать о области уровня класса, области уровня экземпляра и локальной области.
источник
Чтобы иметь доступ к ним из ваших статических методов, они должны быть статическими переменными-членами, например так:
источник
Теперь вы можете добавлять / использовать экземпляры в методе
источник
Я постараюсь объяснить вам статичную вещь. Прежде всего, статические переменные не принадлежат какому-либо конкретному экземпляру класса. Они узнаются по названию класса. Статические методы снова не принадлежат ни одному конкретному экземпляру. Они могут получить доступ только к статическим переменным. Представьте, что вы вызываете MyClass.myMethod (), а myMethod является статическим методом. Если вы используете нестатические переменные внутри метода, как, черт возьми, он узнает, какие переменные использовать? Вот почему вы можете использовать из статических методов только статические переменные. Я повторяю снова, они НЕ принадлежат какому-либо конкретному случаю.
источник
Первое, что нужно знать, это разница между экземпляром класса и самим классом. Класс моделирует определенные свойства и поведение целого в контексте этих свойств. Экземпляр будет определять конкретные значения для этих свойств.
Все, что связано со статическим ключевым словом, доступно в контексте класса, а не в контексте экземпляра класса
Как следствие вышесказанного
Время жизни статического поля / метода эквивалентно времени жизни вашего приложения
Например, автомобиль имеет цвет свойства и демонстрирует поведение «движение». Экземпляр этого автомобиля - красный Volkswagen Beetle, движущийся со скоростью 25 км / ч.
Теперь статическим свойством автомобиля будет количество колес (4) на дороге, и это будет применяться ко всем автомобилям.
НТН
источник
ClassLoader отвечает за загрузку файлов классов. Давайте посмотрим, что происходит, когда мы пишем свои собственные классы.
Пример 1:
Теперь мы можем видеть, что класс «StaticTest» имеет 3 поля. Но на самом деле не существует переменной-члена b, c. Но почему ???. ОК, дабы увидеть. Здесь b, c - переменная экземпляра. Поскольку переменная экземпляра получает память во время создания объекта. Так что здесь b, c еще не получают никакой памяти. Вот почему не существует б, в. Так что существует только существование. Для ClassLoader у него есть только одна информация о. ClassLoader пока не распознает b, c, потому что объект еще не создан.
Давайте посмотрим другой пример: Пример 2:
Теперь, если мы попытаемся скомпилировать этот код, компилятор выдаст ошибку CE. CE: на нестатический метод display () нельзя ссылаться из статического контекста.
Теперь для ClassLoader это выглядит так:
В примере 2 ошибка CE вызвана тем, что мы вызываем нестатический метод из статического контекста. Поэтому ClassLoader не может распознать метод display () во время компиляции. Так что произошла ошибка времени компиляции.
источник
Перед вызовом метода экземпляра или переменной экземпляра необходим объект (экземпляр). Когда переменная экземпляра вызывается из статического метода, компилятор не знает, какому объекту принадлежит эта переменная. Потому что у статических методов нет объекта (всегда только одна копия). Когда вы вызываете переменную экземпляра или методы экземпляра из метода экземпляра, он ссылается на
this
объект. Это означает, что переменная принадлежит любому созданному объекту, и каждый объект имеет свою собственную копию методов экземпляра и переменных.Статические переменные помечаются как,
static
а переменные экземпляра не имеют определенного ключевого слова.источник
Это немного отличается, чтобы объяснить статическое ключевое слово для всех начинающих.
Вы узнаете это ясно, когда будете больше работать с Классами и Объектами.
| * | Статический: Статические элементы могут вызываться с помощью имени класса.
Если вы наблюдаете в кодах, некоторые функции напрямую вызываются с помощью имен классов, таких как
Это потому, что NamFnc и println будут объявлены с использованием ключевого слова static перед ними.
| * | Нестатические: Нестатические элементы можно вызывать с помощью переменной класса.
Если она не статическая, вам нужна переменная класса,
поставить точку после переменной класса, а
затем вызвать функцию.
Ниже код объясняет вам аккуратно
| * | Статическая и нестатическая функция в классе:
| * | Статический и нестатический класс внутри класса:
источник