Spec-Zone .ru
спецификации, руководства, описания, API
|
В этом разделе мы обсуждаем использование static
ключевое слово, чтобы создать поля и методы, которые принадлежат class, а не экземпляру class.
Когда много объектов создаются из того же самого проекта class, у каждого из них есть их собственные отличные копии переменных экземпляра. В случае Bicycle
class, переменные экземпляра cadence
, gear
, и speed
. Каждый Bicycle
у объекта есть свои собственные значения для этих переменных, сохраненных в различных ячейках памяти.
Иногда, Вы хотите иметь переменные, которые характерны для всех объектов. Это выполняется с static
модификатор. Поля, которые имеют static
модификатор в их объявлении вызывают статическими полями или переменными class. Они связываются с class, а не с любым объектом. Каждый экземпляр class совместно использует переменную class, которая находится в одном фиксированном расположении в памяти. Любой объект может изменить значение переменной class, но переменными class можно также управлять, не создавая экземпляр class.
Например, предположите, что Вы хотите создать много Bicycle
объекты и присваивают каждого порядковый номер, начинаясь 1 для первого объекта. Этот Идентификационный номер уникален для каждого объекта и является поэтому переменной экземпляра. Одновременно, Вы нуждаетесь в поле, чтобы отследить сколько Bicycle
объекты были созданы так, чтобы Вы знали что ID присвоиться к следующему. Такое поле не связывается ни с каким отдельным объектом, но с class в целом. Для этого Вы нуждаетесь в переменной class, numberOfBicycles
, следующим образом:
public class Bicycle{ private int cadence; private int gear; private int speed; // add an instance variable for // the object ID private int id; // add a class variable for the // number of Bicycle objects instantiated private static int numberOfBicycles = 0; ... }
На переменные класса ссылается имя class непосредственно, как в
Bicycle.numberOfBicycles
Это проясняет, что они - переменные class.
myBike.numberOfBicycles
Можно использовать Bicycle
конструктор, чтобы установить id
переменная экземпляра и инкремент numberOfBicycles
Переменная class:
public class Bicycle{ private int cadence; private int gear; private int speed; private int id; private static int numberOfBicycles = 0; public Bicycle(int startCadence, int startSpeed, int startGear){ gear = startGear; cadence = startCadence; speed = startSpeed; // increment number of Bicycles // and assign ID number id = ++numberOfBicycles; } // new method to return the ID instance variable public int getID() { return id; } ... }
Язык программирования Java поддерживает статические методы так же как статические переменные. Статические методы, которые имеют static
модификатор в их объявлениях, должен быть вызван с именем class, без потребности в создании экземпляра class, как в
ClassName.methodName(args)
instanceName.methodName(args)
Обычное использование для статических методов должно получить доступ к статическим полям. Например, мы могли добавить статический метод к Bicycle
class к доступу numberOfBicycles
статическое поле:
public static int getNumberOfBicycles() { return numberOfBicycles; }
Не все комбинации экземпляра и переменных class и методов позволяются:
this
ключевое слово как нет никакого экземпляра для this
обратиться к. static
модификатор, в комбинации с final
модификатор, также используется, чтобы определить константы. final
модификатор указывает, что значение этого поля не может измениться.
Например, следующее объявление переменной определяет названную константу PI
, чье значение является приближением пи (отношение окружности круга к его диаметру):
static final double PI = 3.141592653589793;
Константы, определенные таким образом, не могут быть повторно присвоены, и это - ошибка времени компиляции, если Ваша программа пытается сделать так. Условно, имена постоянных величин записываются в прописных буквах. Если имя составляется больше чем из одного слова, слова разделяются подчеркиванием (_).
Bicycle
КлассПосле всех модификаций, сделанных в этом разделе, Bicycle
class теперь:
public class Bicycle{ private int cadence; private int gear; private int speed; private int id; private static int numberOfBicycles = 0; public Bicycle(int startCadence, int startSpeed, int startGear){ gear = startGear; cadence = startCadence; speed = startSpeed; id = ++numberOfBicycles; } public int getID() { return id; } public static int getNumberOfBicycles() { return numberOfBicycles; } public int getCadence(){ return cadence; } public void setCadence(int newValue){ cadence = newValue; } public int getGear(){ return gear; } public void setGear(int newValue){ gear = newValue; } public int getSpeed(){ return speed; } public void applyBrake(int decrement){ speed -= decrement; } public void speedUp(int increment){ speed += increment; } }