|
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;
}
}