1 Мелкая копия и концепция глубокой копии
⑴shallow Copy (мелкое клонирование)
Все переменные скопированного объекта содержат то же значение, что и исходный объект, в то время как все ссылки на другие объекты все еще указывают на исходный объект. Другими словами, мелкое копирование просто копирует рассматриваемый объект, а не объект, который он ссылается.
⑵ Глубокая копия (глубокое клонирование)
Все переменные скопированного объекта содержат то же значение, что и исходный объект, за исключением тех переменных, которые относятся к другим объектам. Те переменные, которые относятся к другим объектам, будут указывать на скопированный новый объект, а не исходные ссылочные объекты. Другими словами, глубокая копия копирует все объекты, на которые ссылается объект, который будет скопирован.
2 Метод Java's Clone ()
⑴ Метод клона копирует копию объекта и возвращает ее в абонент. Вообще говоря, метод клона () удовлетворяет:
① Для любого объекта x есть x.clone ()! = X // Клонированный объект не тот же объект, что и исходный объект ② для любого объекта x, есть x.clone (). GetClass () = = x ..
⑵clone объектов на Java
① Чтобы получить копию объекта, мы можем использовать метод клона () класса объекта.
② Перезапись метод клона () базового класса в производном классе и объявить его публичным.
③ В методе клона () полученного класса Call Super.clone ().
④ Реализуйте клонируемый интерфейс в полученном классе.
Пожалуйста, смотрите следующий код:
Ученик открытого класса клонируется {string name; Студент) super.clone (); // clone () в объекте распознает, какой объект вы хотите скопировать. } catch (clonenotsupportedException e) {System.out.println (e.toString ()); S2 = (студент) S1.clone (); System.out.println ("name ="+s1.name+","+"age ="+s1.age); +s2.age); иллюстрировать:
① Какова мы должны назвать Super.clone () при перезаписи метода клона объекта () в полученном классе? Во время выполнения, клон () в объекте распознает, какой объект вы хотите скопировать, затем выделяет пространство для этого объекта и копирует объект, копируя содержимое исходного объекта один за другим в пространство хранения нового объекта.
② Метод клона (), унаследованный от класса java.lang.object, является мелкой копией. Следующий код может доказать это.
Класс профессор {string name; int возраст; Студент (Строка, int age, профессор P) {this.name = name; .CLONE (); {Профессор P = новый профессор ("Wangwu", 50); "; s2.p.age = 30; system.out.println (" name = "+s1.p.name+", "+" age = "+s1.p.age); System.out.println (" Имя = "+s2.p.name+", "+" age = "+s2.p.age); // Результаты выходных преподавателей студентов 1 и 2 становятся лиси, а возраст - 30. }} Итак, как мы должны реализовать глубокий клонирование, то есть профессор, который модифицирует S2, не повлияет на профессора, кто S1? Код улучшается следующим образом.
Улучшения, чтобы сделать профессор 1 -го студента без изменений (глубокий клон)
Класс профессор Клонируется {String name; Clone (); int age, профессор P) {this.name = name; } catch (clonenotsupportedException e) {System.out.println (e.toString ()); ] args) {Профессор P = новый профессор ("Wangwu", 50); "LISI"; System.out.println ("name ="+s1.p.name+","+"age ="+s1.p.age); "+" age = "+s2.p.age);}} 3 Используйте сериализацию, чтобы сделать глубокую копию (главным образом, чтобы избежать переписывания метода клона () глубокой копии более сложных объектов, а также может реализовать точку останова непрерывная передача и другие функции)
Процесс написания объектов в потоки - это процесс сериализации, но он очень ярко называется «замороженным» или «выбирать» процесс в кругах программистов Java; процесс.
Следует отметить, что то, что записано в потоке, является копией объекта, и исходный объект все еще существует в JVM, так что то, что «мариновано в соленые огурцы» - это только копия объекта, и маринары Java все еще могут быть свежим.
Глубоко копирование объекта на языке Java часто может сначала заставить объект реализовать сериализуемый интерфейс, а затем написать объект (на самом деле просто копию объекта) в поток (маринованный в соленые опор), а затем прочитайте его из потока (положить Сократы назад) могут реконструировать объект.
Ниже приведен исходный код глубокой копии.
Public Object DeepClone () {// Напишите объект в потоковом плане BYTARRAYOUTSTREAM BO = NEW BYTEARRAYOUTPUTSTREAM (); bo.tobytearray ()); Предпосылка для этого заключается в том, что объект и все ссылки на объект сериализируются. . снаружи. Приведенный выше пример кода улучшается следующим образом.
Учитель Class реализует Serializable {string name; возраст; Public void (String name, int Age, учитель T) {this.name = name; Перейдите к потоку Bytearrayoutoutstream bo = new Bytearrayoutputstream (); Новый объект InputStream (BI); 18, t); name = "+s1.t.name+", "+" age = "+s1.t.age);}}