文档章节

Java对象的拷贝

一抹真
 一抹真
发布于 2015/02/05 14:56
字数 733
阅读 16
收藏 0

上文提到hibernate三种对象状态,对于持久态的对象我们进行set时数据库就会做更新。鉴于此,我们可以将该持久化状态对象copy一份,然后对copy过来的对象做操作,就不会影响原来的持久化状态对象了。有关Java对象拷贝如下文:

转载


1.java里的clone分为: 
A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 
b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。 
Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点 
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。 
2.在派生类的clone()方法中,调用super.clone()。 
3.在派生类中实现Cloneable接口。 

Object类里的clone方法是浅复制(浅克隆) 

浅复制(浅克隆)的例子如下:

public class CloneTest
{
 public static void main(String[] args) throws Exception
 {
  // teacher对象将被clone出来的Student对象共享.
  Teacher teacher = new Teacher();
  teacher.setAge(40);
  teacher.setName("Teacher zhang");
  Student student1 = new Student();
  student1.setAge(20);
  student1.setName("zhangsan");
  student1.setTeacher(teacher);
  // 复制出来一个对象student2
  Student student2 = (Student) student1.clone();
  System.out.println(student2.getAge());
  System.out.println(student2.getName());
  System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
  System.out.println(student1.getTeacher().getAge());
  System.out.println(student1.getTeacher().getName());
  // 修改student2的引用对象
  student2.getTeacher().setAge(50);
  student2.getTeacher().setName("Teacher Li");
  System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
  System.out.println(student1.getTeacher().getAge());
  System.out.println(student1.getTeacher().getName());
 }
}
class Teacher
{
 public int age;
 public String name;
 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;
 }
}
class Student implements Cloneable
{
 public int age;
 public String name;
 public Teacher teacher;
 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 Teacher getTeacher()
 {
  return teacher;
 }
 public void setTeacher(Teacher teacher)
 {
  this.teacher = teacher;
 }
 @Override
 public Object clone() throws CloneNotSupportedException
 {
  return super.clone();
 }
}
输出结果为:
20
zhangsan
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang
~~~~~~~~~~~~~~~~~~~~~~
50
Teacher Li

 

2.深复制(深Clone)例子:

 public class DeepCloneTest
{
 public static void main(String[] args) throws Exception
 {
  // teacher对象将不被clone出来的Student对象共享.
  Teacher teacher = new Teacher();
  teacher.setAge(40);
  teacher.setName("Teacher zhang");
  Student student1 = new Student();
  student1.setAge(20);
  student1.setName("zhangsan");
  student1.setTeacher(teacher);
  // 复制出来一个对象student2
  Student student2 = (Student) student1.clone();
  System.out.println(student2.getAge());
  System.out.println(student2.getName());
  System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
  System.out.println(student1.getTeacher().getAge());
  System.out.println(student1.getTeacher().getName());
  // 修改student2的引用对象
  student2.getTeacher().setAge(50);
  student2.getTeacher().setName("Teacher Li");
  System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
  System.out.println(student1.getTeacher().getAge());
  System.out.println(student1.getTeacher().getName());
 }
}
class Teacher implements Cloneable
{
 public int age;
 public String name;
 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;
 }
 @Override
 public Object clone() throws CloneNotSupportedException
 {
  return super.clone();
 }
}
class Student implements Cloneable
{
 public int age;
 public String name;
 public Teacher teacher;
 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 Teacher getTeacher()
 {
  return teacher;
 }
 public void setTeacher(Teacher teacher)
 {
  this.teacher = teacher;
 }
 @Override
 public Object clone() throws CloneNotSupportedException
 {
  Student student = (Student) super.clone();
  // 将引用的对象teacher也clone下
  student.setTeacher((Teacher) (student.getTeacher().clone()));
  return student;
 }
}
输出结果为:
20
zhangsan
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang

 

本文转载自:http://blog.csdn.net/jdluojing/article/details/6963112

一抹真
粉丝 0
博文 10
码字总数 2106
作品 0
普陀
高级程序员
私信 提问
System.arraycopy为什么快

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyangzhizhou/article/details/79504818 前言 在 Java 编程中经常会遇到数组拷贝操作,一般会有如下四种方...

超人汪小建(seaboat)
2018/03/10
0
0
Java拾遗:008 - 对象克隆与浅拷贝、深拷贝

对象克隆 Object类中有一个方法叫,完整代码 首先它是一个Native方法,而且是受保护的(),抛出一个异常(JDK1.8)。 通常程序员自己定义的类不能直接调用方法,如果要在外部调用,需要重写...

一别丶经年
2018/08/04
53
0
叮!您收到一份超值Java基础入门资料!

摘要:Java语言有什么特点?如何最大效率的学习?深浅拷贝到底有何区别?阿里巴巴高级开发工程师为大家带来Java系统解读,带你掌握Java技术要领,突破重点难点,入门面向对象编程,以详细示例...

聒小小噪
2018/05/12
0
0
11、Java并发性和多线程-Java内存模型

以下内容转自http://ifeve.com/java-memory-model-6/: Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内...

easonjim
2017/06/15
0
0
Java并发(1)- 聊聊Java内存模型

引言 在计算机系统的发展过程中,由于CPU的运算速度和计算机存储速度之间巨大的差距。为了解决CPU的运算速度和计算机存储速度之间巨大的差距,设计人员在CPU和计算机存储之间加入了高速缓存来...

knock_小新
2018/07/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

反编译9.png图片还原

本文链接:https://blog.csdn.net/a1140778530/article/details/10528507 经常反编译apk文件找资源,9.png的文件处理起来很麻烦。 最近使用Ant自动编译打包app时,从别处搜罗来的9.png文件导...

shzwork
8分钟前
2
0
Shell脚本应用 – for、while循环语句

一、for循环语句 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如:根据通讯录中的姓名列表创建系统账号等情况。 当面对各种...

linux-tao
8分钟前
2
0
RPA风潮下企业财务工作模式的变革

RPA(机器人流程自动化)在财务领域的应用,正给企业财务带来前所未有的改变。 前RPA时代,财务领域面临的痛点 在RPA机器人应用之前,企业财务工作进程的推进,主要通过财务人员人工操作或信...

UiBot
13分钟前
2
0
Hive之命令行修改表注释

最近遇到一个需求,在不重建表的情况下,修改表的注释,hive有没有类似关系型数据库的SQL命令来修改呢,找了下,亲测有效,如下List-1 List-1 hive>use your_schemahvie>ALTER TABLE tabl...

克虏伯
14分钟前
2
0
是什么,它的作用是什么

在HTML文档的首部往往会有这么一句话<!DOCTYPE html>,许多时候我们忽视了它的存在,它实际上是一个声明,告诉浏览器用哪种HTML版本的规范来解读HTML文档。 尽管我们不给出这句声明浏览器照样...

前端老手
19分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部