Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_-_Razrabotka_web-prilozheny_Java(1).doc
Скачиваний:
46
Добавлен:
25.03.2015
Размер:
1.23 Mб
Скачать
  1. Клонирование объектов. “Сборка мусора” и освобождение ресурсов.

Объекты в методы передаются по ссылке, в результате чего в метод передает- ся ссылка на объект, находящийся вне метода. Поэтому если в методе изменить значение поля объекта, то это изменение коснется исходного объекта. Во избежа- ние такой ситуации для защиты внешнего объекта следует создать клон (копию) объекта в методе. Класс Object содержит protected-метод clone(), осу- ществляющий побитовое копирование объекта производного класса. Однако сна- чала необходимо переопределить метод clone() как public для обеспечения возможности вызова из другого пакета. В переопределенном методе следует вы- звать базовую версию метода super.clone(), которая и выполняет собственно клонирование. Чтобы окончательно сделать объект клонируемым, класс должен реализовать интерфейс Cloneable. Интерфейс Cloneable не содержит мето- дов относится к помеченным (tagged) интерфейсам, а его реализация гарантирует, что метод clone() класса Object возвратит точную копию вызвавшего его объекта с воспроизведением значений всех его полей. В противном случае метод генерирует исключение CloneNotSupportedException. Следует отметить, что при использовании этого механизма объект создается без вызова конструкто- ра. В языке C++ аналогичный механизм реализован с помощью конструктора ко- пирования.

Когда никаких ссылок на объект не существует, то есть все ссылки на него вышли из области видимости программы, предполагается, что объект больше не нужен, и память, занятая объектом, может быть освобождена. “Сборка мусора” происходит нере- гулярно во время выполнения программы. Форсировать “сборку мусора” невоз- можно, можно лишь “рекомендовать” ее выполнить вызовом метода Sys- tem.gc() или Runtime.getRuntime().gc(), но виртуальная машина выполнит очистку памяти тогда, когда сама посчитает это удобным. Вызов ме- тода System.runFinalization() приведет к запуску метода finalize() для объектов утративших все ссылки.

  1. Интерфейсы.

Интерфейсы подобны полностью абстрактным классам, но не являются клас- сами. Ни один из объявленных методов не может быть реализован внутри интер- фейса. В языке Java существуют два вида интерфейсов: интерфейсы, определяю- щие контракт для классов посредством методов, и интерфейсы, реализация кото- рых автоматически (без реализации методов) придает классу определенные свой- ства. К последним относятся, например, интерфейсы Cloneable и Serializ- able, отвечающие за клонирование и сохранение объекта в информационном потоке соответственно. Все объявленные в интерфейсе методы автоматически трактуются как public и abstract, а все поля – как public, static и final, даже если они так не объявлены. Класс может реализовывать любое число интерфейсов, указы- ваемых через запятую после ключевого слова implements, дополняющего определение класса. После этого класс обязан реализовать все методы, получен- ные им от интерфейсов, или объявить себя абстрактным классом. На множестве интерфейсов также определена иерархия наследования, но она не имеет отношения к иерархии классов. Определение интерфейса имеет вид: [public] interface Имя [extends Имя1, Имя2,…, ИмяN] { /*реализация интерфейса*/

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]