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

250
11 октября 2017, 06:08

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

Вопросы:

  1. Почему так происходит?
  2. И когда я пытался скомпилировать без методов, просто меняя значение age напрямую, то у меня менялись значения обоих объектов muhtar и chakki, то есть они были равны последнему значению. Отсюда и вопрос почему значения переменных двух объектов(muhtar, chakki) были равны последнему измененному значению. Ведь я создал класс Dog и объявил 2 объекта(muhtar, chakki), и думал что значения будут для этих объектов отдельными и разными. Но, видимо, я что-то не так понял.

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

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

READ ALSO
Передать данные: AsyncTask, WeakReference в EditText

Передать данные: AsyncTask, WeakReference в EditText

Есть activity с картой, при нажатии на карту происходит асинхронный запрос и возвращаются данные JSONОдно из полей - адрес

188
Коллекция без дублирования элементов

Коллекция без дублирования элементов

Допустим, есть строки А, Б, В, Я, ВПосле добавления в какую коллекцию в ней будет только А, Б, В, Я? Или велосипед писать?

188
запуск powershell скрипта из java

запуск powershell скрипта из java

Пытаюсь запустить shell скрипт из java, но ничего не происходитОбычный txt запускается без проблем

213