Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 6. Введение в классы 151

class Box { double width; double height; double depth;

// Это конструктор класса Box.

Box(double w, double h, double d) {

width = w;

height = h;

depth = d; }

// вычислить и возвратить объем double volume() {

return width * height * depth; } }

class BoxDemo? {

public static void main(String args[]) {

/'/ объявить, распределить и инициализировать Box-объекты Box myboxl = new Box(10, 20, 15); Box mybox2 = new Box(3, 6, 9);

double vol.;

// получить объем первого блока

vol = myboxl.volume{);

System.out.println("Объем равен " + vol);

// получить объем второго блока vol = mybox2.volume();

System.out.println("Объем равен " + vol); } }

Вывод этой программы:

Объем равен 3000.0 Объем равен 162.0

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

Box myboxl = new Box(10, 20, 15);

значения 10, 20 и 15 передаются конструктору box о, когда new создает объ­ект. Таким образом, копии переменных width, height и depth объекта myboxl будут содержать значения 10, 20 и 15, соответственно.

/52 Часть I. Язык Java

Ключевое слово this

Иногда у метода возникает необходимость обращаться к объекту, который его вызвал. Для этого Java определяет ключевое слово this. Его можно ис­пользовать внутри любого метода, чтобы сослаться на текущий объект. То есть this — это всегда ссылка на объект, метод которого был вызван. Вы можете использовать this везде, где разрешается ссылка на объект текущего класса.

Чтобы лучше понять, на что ссылается this, рассмотрим следующую версию box():

// Избыточное использование this. Box(double w, double h, double d) {

this.width = w;

this.height = h;

this.depth = d; }

Эта версия box () работает точно так же, как и более ранняя. Использование this избыточно, но совершенно корректно. Внутри box () this будет всегда ссылаться на вызывающий объект. Хотя и избыточный в данном случае, this полезен в других контекстах, один из которых объясняется в следую­щем разделе.

Скрытие переменной экземпляра

Как известно, в Java недопустимо объявление двух локальных переменных с одним и тем же именем внутри той же самой или включающей области действия идентификаторов. Заметим, что вы можете иметь локальные пере­менные, включая формальные параметры для методов, которые перекрыва­ются с именами экземплярных переменных класса. Однако, когда локальная переменная имеет такое же имя, как переменная экземпляра, локальная пе­ременная скрывает переменную экземпляра. Вот почему width, height и depth не использовались как имена параметров конструктора box () внутри класса box. Если бы они были использованы для именования этих парамет­ров, то, скажем width, как формальный параметр, скрыл бы переменную экземпляра width. Хотя обычно проще указывать различные имена, сущест­вует другой способ обойти эту ситуацию. Поскольку this позволяет обра­щаться прямо к объекту, это можно применять для разрешения любых кон­фликтов пространства имен, которые могли бы происходить между экземп-лярными и локальными переменными. Ниже представлена другая версия box (), которая использует width, height и depth для имен параметров и за­тем применяет this, чтобы получить доступ к переменным экземпляра с те­ми же самыми именами:

Глава в. Введение в классы 3

// Используйте этот вариант конструктора

// для разрешения конфликтов пространства имен.

Box(double width, double height, double depth) (

this.width = width;

this.height = height;

this.depth = depth; }

Использование this в указанном контексте иногда может привести к путанице, так что некоторые программисты предпочитают не применять имена локальных переменных и формальных параметров, которые совпадают с переменными экземпляра. Конечно, другие программисты, наоборот, верят, что это хорошее соглашение — использовать одинаковые имена — для ясности, и this — что­бы преодолеть скрытие переменной экземпляра. Какой подход принимаете вы — это вопрос вкуса.

Хотя в только что показанных примерах this не имеет никакого существен­ного значения, в некоторых ситуациях он очень полезен.

Сборка"мусора"

Так как объекты распределяются динамически с помощью операции new, можно задать вопрос, как такие объекты ликвидируются и их память осво­бождается для более позднего перераспределения. В некоторых языках, та­ких как C++, от динамически распределенных объектов нужно освобож­даться вручную — при помощи оператора delete. Java использует другой подход: он выполняет освобождение памяти от объекта автоматически. Ме­тодика, которая реализует эту процедуру, называется сборкой "мусора". Она работает примерно так: когда никаких ссылок на объект не существует, предполагается, что этот объект больше не нужен, и память, занятая объек­том, может быть освобождена. Нет никакой явной потребности уничтожать объекты как в C++. Сборка "мусора" происходит не регулярно (если вообще происходит) во время выполнения программы. Она не будет происходить просто потому, что существует один или более объектов, которые уже не используются. Кроме того, различные реализации исполняющей системы Java имеют разные подходы к сборке "мусора", но вам, по большей части, не придется думать об этом при записи своих программ.

Метод finalizeO

Иногда объекту нужно выполнять некоторые действия, когда он разрушает­ся. Например, если объект содержит некоторый не-Java ресурс, такой как дескриптор файла или оконный шрифт, то нужно удостовериться, что до

Соседние файлы в папке JavaLit