Переменная объекта зависит от состояния конкретного экземпляра класса, тогда как переменная класса доступна глобально через сам класс. Это может быть немного нечетко, поэтому вот несколько примеров:
class Muffin {
private static final int calories = 9320;
public String flavor;
public Muffin( String flavor ){
this.flavor = flavor;
}
}
В этом классе calories
является переменной класса. В любом другом фрагменте кода вы можете получить количество калорий в любом виде сдобы, позвонив по номеру Muffin.calories
. В этом случае ключевое слово final
также используется, чтобы сделать число калорий постоянным.
В том же классе у нас есть переменная объекта, flavor
. Это зависит от экземпляра класса и устанавливается в конструкторе.
Muffin myMuffin = new Muffin( "blueberry" );
Так что теперь вы можете получить доступ к вкусу этого кекса, позвонив по номеру myMuffin.flavor
. Обратите внимание, как нам нужно создать экземпляр Muffin
объекта, прежде чем мы сможем получить доступ к его flavor
.
Изменение статических (классовых) переменных
Приведенный выше пример немного натянут, поскольку разные типы кексов будут иметь разное количество калорий. Они полезны для констант, но вот случай, когда значение статической переменной изменяется:
class Muffin {
private static int next_id = 1;
public int id;
public String flavor;
public Muffin( String flavor ){
this.flavor = flavor;
id = next_id++;
}
}
Во втором примере нам нужно иметь уникальный идентификационный номер для каждого кекса, который мы создаем, чтобы у нас была статическая переменная, которая увеличивается каждый раз, когда создается экземпляр Muffin
. Ключевое слово static
делает значение next_id
постоянным при каждом вызове конструктора, поэтому id
будет отличаться и будет увеличиваться для каждого нового кекса.