Главная страница

Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74


Скачать 1.76 Mb.
НазваниеЛабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Дата12.03.2021
Размер1.76 Mb.
Формат файлаdoc
Имя файлаOOP_Lab_Rus.doc
ТипЛабораторная работа
#184105
страница11 из 31
1   ...   7   8   9   10   11   12   13   14   ...   31

4.8 Ключевое слово 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 полезен в других контекстах, один из которых объясняется в следующем разделе.

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


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

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

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

this.width = width;

this.height = height;

this.depth = depth;
Предупреждение.

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

4.9 Сборка «мусора»


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

4.10 Метод finalized


Иногда объекту нужно выполнять некоторые действия, когда он разрушается. Например, если объект содержит некоторый не-Java ресурс, такой как дескриптор файла или оконный шрифт, то нужно удостовериться, что до разрушения объекта эти ресурсы освобождаются. Для обработки таких ситуаций Java использует механизм, называемый завершением (finalization). Применяя завершение, можно определять специальные действия, которые будут выполняться примерно тогда, когда объект будет использоваться сборщиком мусора.

Чтобы добавить завершение к классу, вы просто определяете метод finalize(). Исполняющая система Java вызывает этот метод всякий раз, когда она собирается ликвидировать объект данного класса. Внутри метода finalize() нужно определить те действия, которые должны быть выполнены прежде, чем объект будет разрушен. Сборщик мусора отрабатывает периодически, проверяя объекты, на которые нет больше ссылок ни из выполняющихся процессов, ни косвенных – из других действующих объектов. Непосредственно перед освобождением всех активов исполняющая система Java вызывает для объекта метод finalize().

Метод finalize о имеет следующую общую форму:
protected void finalize() {

// код завершения

}
Здесь ключевое слово protected – спецификатор, который запрещает доступ к finalize() кодам, определенным вне этого класса.

Важно понять, что finalize() вызывается только перед самой сборкой «мусора». Он не запускается, когда объект выходит из области действия идентификаторов, например. Это означает, что вы не сможете определить, когда finalize() будет выполнен (и даже будет ли он выполнен вообще). Поэтому ваша программа должна обеспечить другие средства освобождения системных ресурсов, используемых объектом. Для нормальной работы программы она не должна полагаться на finalize().
Замечание. Если вы знакомы с С++, то знаете, что С++ позволяет определять деструктор для класса, который вызывается, когда объект выходит из области действия идентификаторов. Java не поддерживает этой идеи и не использует деструкторов. Метод finalize() только аппроксимирует функцию деструктора. Когда вы наберетесь больше опыта в Java, то увидите, что потребность в функциях деструктора минимальна из-за наличия в Java подсистемы сборки «мусора».
1   ...   7   8   9   10   11   12   13   14   ...   31


написать администратору сайта