→ Пошук по сайту       Увійти / Зареєструватися
Знання Програмування на Java Реализация ООП в Java

Переменные типа классов в Java

2.1.10.1. Создание переменных типа классов

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

имя-типа идентификатор-переменной;

где имя-типа для переменных типа классов является идентификатором класса, например:

MyClass obj1;

MyClass obj2;

объявляет две переменных класса MyClass с именами obj1 и obj2.

Для того, чтобы переменную можно было использовать, она должна иметь определенное значение. Переменные примитивных типов получают значения с использованием операции присваивания либо при объявлении переменной, либо перед первым использованием переменной.

Аналогично переменным примитивных типов, переменные ссылочных типов также перед своим использованием должны получить определенные значения. Для объявленной же переменной типа класса создать конкретный объект, экземпляр (instance) описанного класса.

Когда создается объект, как правило, необходимо инициализировать его переменные. Для этого в классе определяется специальный метод или перегруженные методы, имена которых совпадают с именем класса. Эти методы называют конструкторами. Конструктор отличается от обычных методов следующими основными особенностями (другие особенности конструкторов будут рассмотрены позднее):

· конструктор не должен возвращать никакого значения;

· тип возвращаемого значения для конструктора не указывается (но можно указать модификатор доступа public или private).

Если конструктор в классе не определен, компилятор Java создает конструктор по умолчанию, который для рассмотренного выше объявления класса не выполняет никаких действий.

Создание объекта выполняется с помощью оператора, имеющего следующий формат:

идентификатор-переменной = new идентификатор-конструктора(параметры);

где идентификатор-переменной – имя создаваемого объекта, идентификатор-конструктора – имя вызываемого конструктора класса, параметры – список параметров, передаваемых конструктору класса.

Примеры создания объектов:

obj1 = new MyClass();

obj2 = new MyClass(12, 5);

Для создания объекта obj1 вызывается конструктор класса MyClass без параметров, а для создания объекта obj2 вызывается другой конструктор этого же класса, которому в качестве аргумента передаются два целых числа.

Операции объявления и инициализации переменных типа класса могут быть объединены в одном операторе, например:

MyClass obj3 = new MyClass(8, 4);

2.1.10.2. Переменные и методы объекта

Как уже говорилось, в описании класса определяются переменные и методы, используемые в данном классе. При создании объекта переменные в разных объектах класса имеют одинаковое имя, но могут иметь разные значения, причем изменение переменной в одном эк­земпляре никак не влияет на значение той же переменной в другом экземпляре, поскольку в каждом объекте для этих переменных выделяется своя область памяти. Хотя под методы класса память выделяется только один раз, но каждый объект класса обращается к методам класса независимо от других объектов. Поэтому такие переменные и методы называются переменными и методами экземпляра класса (instance variables and methods) или пе­ременными и методами объекта. Обращение к переменным и вызов методов объекта в Java имеет следующий формат:

имя-объекта.имя-переменной

и

имя-объекта.имя-метода(аргументы)

где имя-объекта – это идентификатор переменной объекта класса, имя-переменной – идентификатор переменной класса, имя-метода – идентификатор метода класса, а аргументы – значения, задаваемые при вызове метода. Например, если в классе определена переменная var1 типа int, то определение ее значения в объекте obj1 и obj2 можно выполнить с помощью следующего оператора:

int var1InObj1 = obj1.var1;

Изменение значения переменной var1 для объекта obj2 можно выполнить с помощью следующего оператора:

obj2.var1 = 12;

Вызов метода setVar1, определенного в классе MyClass и устанавливающего значение переменной var1 для объектов obj1 и obj2, выполняется с помощью следующих операторов:

obj1.setVar1(2);

obj2.setVar1(2);

Если имя объекта не задано, то для переменной или метода не задано, то компилятор Java считает, что данная переменная или метод определены в данном классе. Можно в этом случае вместо имени объекта указать ключевое слово this. Обычно такое указание используется в тех случаях, если имя переменной класса и аргумент метода в классе совпадают, например:

class MyClass

{

int var1;

void setVar1(int var1)

{

this.var1=var1;

}

}

В этом примере переменной класса var1 присваивается значение параметра var1, определенного в методе setVar1(). Если бы параметр в методе имел другое имя, например, var, ключевое слово this можно было не указывать и оператор присваивания можно было бы записать в виде:

var1=var;

2.1.10.3. Переменные и методы класса

Модификатор static задает переменную, общую для всех объектов данного класса. Обычно для каждой генерации объекта переменным класса выделяется новая память, но когда эти члены класса объявляются с модификатором static, им выделяется место только один раз, независимо от того, сколько объектов было создано. Так, объявленную в классе MyClass переменную

static int objectCount;

можно использовать для подсчета сгенерированных объектов класса MyClass.

Для работы со статическими переменными обычно создаются стати­ческие методы, помеченные модификатором static.

Статические методы и переменные называют также методами и переменными класса (class variables and methods), поскольку к ним можно обращаться, указывая не имя объекта, а имя класса. Например, пусть переменная var2 и метод setVar2 определены в классе MyClass как статические:

static int var2 = 0;

static void setVar2(int var)

{

var2 = var;

}

Тогда обращение к этой переменной и методу будет иметь в программе следующий вид:

int val2Value = MyClass.var2;

MyClass.setVar2(12);

Статические переменные инициализируются еще до начала работы конст­руктора, но при инициализации можно использовать только константные выражения, как это сделано выше для переменной var2. Если же инициализация требует сложных вычислений, напри­мер, циклов для задания значений элементам статических массивов или об­ращений к методам, то эти вычисления заключают в блок, помеченный сло­вом static, который тоже будет выполнен до запуска конструктора, например:

static int var2;

static

{

setVar2(0);

}

Основная особенность статических переменных и методов: доступ к ним выполняется, даже если не создан ни один экземпляр класса. Кроме того, для статических методов действуют следующие основные ограничения:

· в статическом методе нельзя использовать ссылки this;

· в статическом методе нельзя обращаться к нестатическим переменным (т.е. все переменные, объявленные вне статического метода и используемые внутри него, должны быть объявлены с модификатором static);

· в статическом методе нельзя прямо вызывать нестатические методы (т.е. все методы, вызываемые из статического метода, должны быть объявлены с модификатором static).

Последние два условия можно обойти, если обращаться к переменным и методам объекта. Так, если внутри статического метода setVar2 есть прямое обращение к нестатической переменной var1, то это вызовет сообщение об ошибке, однако обращение к var1 как к переменной объекта obj1obj1.var1 ошибки не вызовет.

2.1.10.4. Операции над объектами

Объекты в языке Java могут объединяться с помощью следующих знаков операций:

· присваивание "=" – присвоение указателя на объект ссылочной переменной (при этом новой копии объекта не создается);

· проверка на равенство "==" и на неравенство "!=" – результатом этих операций будет true или false, в зависимости от того, указывают ли сравниваемые переменные на один и тот же объект в памяти.

Кроме того, для объектов определена операция

имя-объекта instanceof имя-класса

Результатом этой операции является true, если объект с идентификатором имя-объекта является реализацией класса с идентификатором имя-класса, и false – в противном случае.

Примеры операций над объектами:

MyClass obj4 = new MyClass(15, 7);

MyClass obj5 = new MyClass(15, 7);

MyClass obj6;

Obj6 = obj4;

boolean isEqual1, isEqual2, isInstance;

// isEqual1 - true (ссылки на obj4 и obj6

// указывают на один и тот же объект)

isEqual = obj6 == obj4;

// isEqual2 - false (obj4 и obj5 имеют одинаковые

// характеристики, но указывают на разные объекты)

isEqual2 = obj4 == obj5;

// isInstance - true (obj4 является объектом

// класса MyClass)

isInstance = obj4 instanceof MyClass;

загрузка...
Теми розділу
Сторінки, близькі за змістом