Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Классы и Объекты
Раздел: Больше на Классах
Понимание Элементов Экземпляра и Класса
Домашняя страница > Изучение Языка Java > Классы и Объекты

Понимание Элементов Экземпляра и Класса

В этом разделе мы обсуждаем использование 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
но этому обескураживают, потому что это не проясняет, что они - переменные class.

Можно использовать 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)
но этому обескураживают, потому что это не проясняет, что они - методы class.

Обычное использование для статических методов должно получить доступ к статическим полям. Например, мы могли добавить статический метод к Bicycle class к доступу numberOfBicycles статическое поле:

public static int getNumberOfBicycles() {
    return numberOfBicycles;
}

Не все комбинации экземпляра и переменных class и методов позволяются:

Константы

static модификатор, в комбинации с final модификатор, также используется, чтобы определить константы. final модификатор указывает, что значение этого поля не может измениться.

Например, следующее объявление переменной определяет названную константу PI, чье значение является приближением пи (отношение окружности круга к его диаметру):

static final double PI = 3.141592653589793;

Константы, определенные таким образом, не могут быть повторно присвоены, и это - ошибка времени компиляции, если Ваша программа пытается сделать так. Условно, имена постоянных величин записываются в прописных буквах. Если имя составляется больше чем из одного слова, слова разделяются подчеркиванием (_).


Отметьте: Если тип примитива или строка определяются как константа, и значение известно во время компиляции, компилятор заменяет постоянное имя всюду в коде с его значением. Это вызывают постоянным временем компиляции. Если значение константы в изменениях внешнего мира (например, если это узаконивается, что пи фактически должно быть 3.975), Вы должны будете перекомпилировать какие-либо классы, которые используют эту константу, чтобы получить текущую стоимость.

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

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Управление Доступом к Элементам Класса
Следующая страница: Инициализация Полей