Страницы

Поиск по вопросам

понедельник, 4 марта 2019 г.

Ошибка “non-static variable this cannot be referenced from a static context”

Учусь программировать по учебнику и попытался понять принципы ООП. Написал следующий код в Main.java:
public class Main {
public static void main (String [] args) {
Dog chakki = new Dog(); Dog muhtar = new Dog(); muhtar.bark(); chakki.setAge(12); System.out.println(muhtar.getAge()); System.out.println(chakki.getAge()); } }
И в той же директории создал Dog.java и код из неё:
public class Dog {
private static int age = 10;
public static void bark() { System.out.println("Gaf Gaf"); }
public static int getAge() { return age; }
public static void setAge(int age) { this.age = age; } }
И когда пытался скомпилировать в командной строке выдаёт ошибку:
.\Dog.java:19: error: non-static variable this cannot be referenced from a static context this.age = age;
^ 1 error
Вопросы:
Почему так происходит? И когда я пытался скомпилировать без методов, просто меняя значение age напрямую, то у меня менялись значения обоих объектов muhtar и chakki, то есть они были равны последнему значению. Отсюда и вопрос почему значения переменных двух объектов(muhtar, chakki) были равны последнему измененному значению. Ведь я создал класс Dog и объявил 2 объекта(muhtar, chakki), и думал что значения будут для этих объектов отдельными и разными. Но, видимо, я что-то не так понял.
Помогите разобраться и понять)))


Ответ

Чем отличается static и не-static
Когда вы объявляете переменную как static, она принадлежит всему классу целиком, а не каждому объекту. И существует эта переменная в единственном экземпляре, сколько бы ни было экземпляров класса.
Вот это — возраст всех собак вообще. У вас на двух собак — один возраст. Не годится, потому что у собак бывают разные возраста.
private static int age = 10;
А этот метод устанавливает возраст всех собак разом:
public static void setAge...
А нужен возраст каждой отдельно взятой собаки из класса собак:
private int age = 10;
Причины ошибки “non-static variable this cannot be referenced from a static context”
Далее: this.age означает значение переменной age в данном конкретном (this) экземпляре класса. Но вы выполняете этот код в статическом методе, принадлежащем классу. Поскольку метод относится ко всему классу, конкретные экземпляры ему неизвестны.
Поэтому возникает ошибка “non-static variable this cannot be referenced from a static context”. Дословно: вы обращаетесь к нестатической переменной, но делаете это без уважения из статического контекста, и это не имеет смысла.

Комментариев нет:

Отправить комментарий