Программирование на JAVA

Навигация

Лекция 1. Что такое Java? История создания

Лекция 2. Основы объектно-ориентированного программирования

Лекция 3. Лексика языка

Лекция 4. Типы данных

Лекция 5. Имена. Пакеты

Лекция 6. Объявление классов

Лекция 7. Преобразование типов

Лекция 8. Объектная модель в Java

Лекция 9. Массивы

Лекция 10. Операторы и структура кода. Исключения

Лекция 11. Пакет java.awt

Лекция 12. Потоки выполнения. Синхронизация

Лекция 13. Пакет java.lang

Лекция 14. Пакет java.util

Лекция 15. Пакет java.io

Лекция 16. Введение в сетевые протоколы

Реклама :





Обратите внимание, что сам класс Object не реализует интерфС1] Cloneable, а потому попытка вызова new Object().clone() будет приводи, к ошибке времени исполнения. Метод с1опе() предназначен скорее ;щ использования в наследниках, которые могут обращаться к нему с пом0. шью выражения super.clone(). При этом могут быть сделаны следующ^ изменения:

• модификатор доступа расширен до public;

• удалено предупреждение об ошибке CloneNotSupportedException

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

Напомним, что все массивы реализуют интерфейс Cloneable и, та­ким образом, доступны для клонирования.

Важно помнить, что все поля клонированного объекта приравнива­ются, их значения никогда не клонируются. Рассмотрим пример:

public class Test implements Cloneable { Point p; int height;

public Test(int x, int y, int z) { p=new Point(x, y); height=z;

}

public static void main(String s[]) { Test t1=new Test(1, 2, 3), t2; try{

t2=(Test)t1.clone(); } catch (CloneNotSupportedException e) {} t1.p.x=-1; t1.height=-1;

System. out.println("t2. p. x=" + t2.p.x + ", t2.height=" +12.height);

}

}

Результатом работы программы будет: t2.p.x=-1, t2.height=3

Из примера видно, что примитивное поле было скопировано и далее существует независимо в исходном и клонированном объектах. Изменение одного не сказывается на другом.

А вот ссылочное поле было скопировано по ссылке, оба объекта ссы­лаются на один и тот же экземпляр класса Point. Поэтому изменения, происходящие с исходным объектом, сказываются на клонированном.

Этого можно избежать, если переопределить метод clone() в классе Test.

public Object clone() { Test clone=null; try{

clone=(Test) super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(e.getMessageO);

}

clone.p=(Point)clone.p.clone(); return clone;

}

Обратите внимание, что результат метода Object.clone() приходится явно приводить к типу Test, хотя его реализация гарантирует, что клониро­ванный объект будет порожден именно от этого класса. Однако тип возвра­щаемого значения в данном методе для универсальности объявлен как Object, поэтому явное сужение необходимо.

Теперь метод main можно упростить:

public static void main(String s[]) { Testt1=newTest(1, 2, 3); Test t2=(Test)t1.clone(); t1.p.x=-1; t1.height=-1;