Учусь программировать по учебнику и попытался понять принципы ООП. Написал следующий код в 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”. Дословно: вы обращаетесь к нестатической переменной, но делаете это без уважения из статического контекста, и это не имеет смысла.
Комментариев нет:
Отправить комментарий