先定义一个标准的javabean对象,并实现持久化接口
请看代码:
package com.ben.clone;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Person implements Serializable
{
private int age;
private String name;
private char sex;
private List sth = new ArrayList();
private Map bt = new HashMap();
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public char getSex()
{
return sex;
}
public void setSex(char sex)
{
this.sex = sex;
}
public List getSth()
{
return sth;
}
public void setSth(List sth)
{
this.sth = sth;
}
public Map getBt()
{
return bt;
}
public void setBt(Map bt)
{
this.bt = bt;
}
}
再写个类实现二进制克隆对象:
package com.ben.clone;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ByteCloneTest
{
/**
* <pre>
* 以二进制方式克隆对象
* </pre>
* @param src 被克隆的对象
* @return 克隆的对象
*/
public static final Object byteClone(Object src)
{
try
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(src);
out.close();
ByteArrayInputStream bin = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bin);
Object clone = in.readObject();
in.close();
return (clone);
}
catch (ClassNotFoundException e)
{
throw new InternalError(e.toString());
}
catch (StreamCorruptedException e)
{
throw new InternalError(e.toString());
}
catch (IOException e)
{
throw new InternalError(e.toString());
}
}
public static void main(String[] args)
{
Person p = new Person();
p.setAge(80);
p.setName("jerry");
p.setSex('F');
List list = new ArrayList();
list.add("apple");
list.add("orange");
list.add("banana");
Map map = new HashMap();
map.put("哥哥", "liuliu");
map.put("姐姐", "linlin");
map.put("李李", "lili");
p.setBt(map);
p.setSth(list);
Person ps = (Person)ByteCloneTest.byteClone(p);
ps.setName("benlsoft");
System.out.println("p----"+p.getName());
System.out.println("ps---"+ps.getName());
}
}
发现两个克隆的对象包含的对象都不是引用对象。这样就实现了深度克隆,不敢想象。
分享到:
相关推荐
通过上述介绍可以看出,Java中的深度克隆可以通过多种方式实现,开发者可以根据实际情况选择最适合的方法。无论是使用`Cloneable`接口还是序列化与反序列化,深度克隆都能有效地解决对象拷贝带来的问题,提高程序的...
要实现深度克隆,首先,你的类需要实现`java.io.Serializable`接口,这是Java中用于序列化的标记接口。然后,你可以定义一个名为`copy()`的方法来执行深度克隆,如下所示: ```java public class YourClass ...
这个类是基于格里高利历(公历)的,是Java中最常用的日期时间类之一。在给定的压缩包文件中,可能包含了关于如何使用`GregorianCalendar`来获取一年内特定月份的日历信息的练习代码,如`Exercise6_6.java`,以及...
通常,这种命名方式表示这是一个Git仓库的克隆或导出,其中包含了一系列的课程材料和示例代码。这意味着你将获得一个结构化的学习路径,而不是零散的教程。 在Java学习的初期,你将接触到基础语法和概念,如变量、...
在准备Java面试的过程中,面试者应注重知识点的理解和应用,而不是简单地死记硬背。通过实际的编码实践和问题解决能力,能够更好地应对面试官的提问,同时加深对Java编程的理解。另外,多线程编程是Java面试中的一个...
ion-java, Java流解析器/序列化程序 一个Java实现的数据符号 。 设置这个库包含一个 git模块 ion-tests,它保存了 ion-java 测试单元使用的测试...克隆 ion-java 存储库并初始化它的ion-tests 模块的最简单方法是运行
本文将深入探讨如何使用jQuery实现元素的克隆以及如何为元素赋值,同时也会提及如何结合使用AJAX技术进行克隆操作。 首先,让我们了解什么是元素克隆。在编程中,克隆指的是创建一个对象或结构的副本,这个副本与...
7. **五子棋**:可能是一个简单的Java游戏示例,用于实践事件处理和图形用户界面(GUI)编程,这通常是Java桌面程序的一部分。 8. **Java_Date**:Java的日期和时间处理涉及java.util.Date和java.time包中的类。...
`java.lang`包中最基本的类是`Object`,它是所有类层次结构的根,而`Class`类的实例则代表运行时的类。 `java.lang`包包括以下关键类: 1. **Boolean**: 表示布尔值`true`和`false`。 2. **Long, Short, Byte, ...
- **String**: 用于表示不可变的字符序列,是Java中最常用的数据类型之一。 - **Character**: 处理单个Unicode字符,包括字符的转换和比较。 - **Number**: 是所有数值类型的抽象基类,如Integer、Double等。 - ...
如果不实现这两个接口,Java 无法保证对象的状态可以正确复制或恢复,因此不能进行克隆或序列化操作。 #### 20. Iterator 接口的功能是什么? Iterator 接口提供了遍历集合元素的标准方法。它允许用户迭代地访问...
Spring是Java Web开发中最受欢迎的框架之一,提供依赖注入、AOP(面向切面编程)等功能。本章将介绍Spring的基本概念和配置。 第十章:Spring MVC与RESTful API Spring MVC是Spring框架的一部分,用于构建Web应用。...
#### 第二章:简单Java程序 - 通过编写简单的Java程序来熟悉开发流程和基本语法结构。 #### 第三章:Java基础程序设计 - **Java数据类型** - 基本数据类型:如int、double等。 - 引用数据类型:如String、数组...
1. **接口声明**:实现`Cloneable`接口可以让其他代码知道这个类可以被安全地克隆。 2. **设计模式**:这是克隆设计模式的一部分,用于保证对象的深复制。 ### default 在 switch 的最后 (checkstyle:...
例如,某些Collection实现可能支持克隆和序列化,而其他实现可能不支持或者有不同的实现方式。因此,将这些行为强制绑定在接口上会限制实现的灵活性。 Map接口并不继承Collection接口,因为Map是一种键值对的数据...