Страницы

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

среда, 25 декабря 2019 г.

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

#java


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


Помогите разобраться и понять)))
    


Ответы

Ответ 1



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

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

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