Java 对象的一共有 3 种复制对象的方式。

1.直接赋值 (引用复制 ),此种复制方式比较常用。

诸如 A  a = b ;  a 是直接复制了b的引用 ,也就是说它俩指向的是同一个对象。 此时 a == b  [ true ] 。

 class A{
private String string;
A(){string = new String("original state");}
public void set(String string) {this.string = string;}
public String get() {return string;}
} public class B{
public static void main(String[] args) {
// TODO 自动生成的方法存根
A a = new A();
A b = a;
System.out.println(a == b);
a.set("state has changed");
System.out.println(a == b);
}
}

2.浅拷贝  -------  复制当前对象的非静态字段【静态字段只在类加载的时候加载一次】,如果当前字段为 值类型 字段,那么直接复制该字段,如果是 引用类型 的,则对其复制引用。

所谓的值类型就是指Java中的8种基本类型,那么什么是值类型的复制呢?

举个例子 int A = 0; int B = A; 那么这样B拷贝的是A指向的常量对象,而非A的引用,当A改变时,并不会影响B的指向。【Ps: A =1; 则B = 0 ,而非 1 , 这就是值类型的复制】

所谓的引用类型就是一些你自己构建的类和库中的一些类实例化出来的对象,引用复制又指的啥呢?

举个例子

class A {public int value = 0 ; }  ====>     A a = new A(); A b = a;      =====>  a.value = 1;  那么 ==>  b.value = 1; 因为它们指向的是同一个对象【复制的是引用】

 class B implements Cloneable{

     private C c;

     private String string ;
public B() {string = new String("Init string"); c = new C();}
public void set(String string) {this.string = string;}
public String get() {return string;} //setC()方法中添加一句 c = new C() ,就变为深拷贝了,因为添加了 这句代码, 拷贝 引用类型时,就变成拷贝其对象,而不是引用了
public void setC(String string) {c.set(string);}
public String getC() {return c.get();} @Override
public Object clone() {
B sCopy = null;
try {
sCopy = (B)super.clone();
}catch(Exception e) {
e.printStackTrace();
}
return sCopy;
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根 B sCopyA = new B();
B sCopyB = (B) sCopyA.clone(); sCopyA.set("hava changed !");
// sCopyA.string = hava changed ! ------- sCopyA.string = Init string
// 改变了 sCopyA 并没有改变 sCopyB。 因为 B.string 是一个值类型
System.out.println("sCopyA.string = "+ sCopyA.get()+" ------- sCopyA.string = "+ sCopyB.get()); sCopyB.setC("C have Changed !");
// C.string = C have Changed ! ------- C.string = C have Changed !
// 改变了 sCopyA 同时也改变 sCopyB。因为 B.string 是一个引用类型
System.out.println("C.string = "+ sCopyA.getC()+" ------- C.string = "+ sCopyB.getC());
}

3.深拷贝  -------  和浅拷贝的区别就在于,其不管字段类型是什么,统统的全给拷贝过去【即使相对与 非基本类型而言 拷贝的也是对象而不是引用 ,深拷贝之后将会产生2个对象 ,浅拷贝只是一个对象的2个引用而已(相当于1个人的2个名字)】。

我们只要在 2的基础上添加一行代码就行, 因为只要将 引用字段,也进行复制 ,就是深拷贝了。

附:1.clone()方法 需要覆写。 2.覆写clone()方法需要实现Cloneable 接口, 未实现的话会抛出异常。 3 .clone()是本地方法,其内部实现如下图。

Java 对象复制的更多相关文章

  1. java对象复制

    一,a和b都指向同一个对象,改变其中一个另一个也会改变 package com.ciaos; class Human{ public Human(String string, int i) { // ...

  2. JAVA对象转换JSON

    1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码 代码如下: JSONArray array = JSONArray.fromObject(userlist); String ...

  3. java中复制对象通过反射或序列化

    在使用缓存读取数据后修改发现缓存被修改.于是找了下复制对象的方法. 关于对象克隆 按我的理解,对象是包含引用+数据.通常变量复制都是将引用传递过去.比如: Person p1 = new Person ...

  4. Java反射 - 2(对象复制,父类域,内省)

    为什么要复制对象?假设有个类Car,包含name,color2个属性,那么将car1对象复制给car2对象,只需要car2.setName(car1.getName)与car2.setColor(ca ...

  5. Java——对象的复制、克隆、序列化

    原创作者: https://blog.csdn.net/lmb55/article/details/78277878对象克隆(复制)假如说你想复制一个简单变量.很简单: int apples = 5; ...

  6. java对象实现深复制的方法

    p2 = (Person)org.apache.commons.lang3.ObjectUtils.cloneBean(p); Person p2 = new Person(); p2 = (Pers ...

  7. Java对象和集合的拷贝/克隆/复制

    昨天同事遇到了一个奇怪的问题,他需要将一个JavaBean拷贝一份,然后对新创建的Bean进行操作.但是他对新的Bean操作后,会影响旧的Bean的值.当听到这个问题的时候,我第一反应就是他的拷贝方法 ...

  8. java对象克隆复制

    原文链接:https://blog.csdn.net/ztchun/article/details/79110096 自己先简单描述总结一下:当想要将一个对象中已有的值直接给另外一个对象的时候,其实并 ...

  9. java对象拷贝和复制

    参考文章:http://blog.csdn.net/XIAXIA__/article/details/41652057 解决问题:深拷贝.浅拷贝 和普通的对象赋值有什么区别? 对象复制 例如:Pers ...

随机推荐

  1. css预处理器less和scss之less介绍(一)

    第一次发的标题有误,重发一遍,抱歉了 一.less基础语法 1.声明变量:@变量名:变量值 使用变量:@变量名 例如 @color : #ff0000; @length : 100px; #div1{ ...

  2. 团队作业8——第二次项目冲刺(Beta阶段)5.21

    1.当天站立式会议照片 会议内容: 本次会议为第三次会议 本次会议在陆大楼2楼召开,本次会议内容: ①:检查总结第二次任务完成情况 ②:布置第三次任务的详细分工 ③:规定完成时间是在第四次任务之前 ④ ...

  3. 201521123006 《java程序设计》 第13周学习总结

    1. 本周学习总结 1.以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.j ...

  4. Oracle与Mysql区别简述

    在Mysql中,一个用户下可以创建多个库: 而在Oracle中,Oracle服务器是由两部分组成 数据库实例[理解为对象,看不见的] 数据库[理解为类,看得见的] 一个数据库实例可拥有多个用户,一个用 ...

  5. 时间效率:最小的K个数

    输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.ArrayList; import jav ...

  6. JDBC操作数据库之删除数据

    删除数据使用的SQL语句为delete语句,如果删除图书id为1的图书信息,其SQL语句为: delete from book where id=1 在实际开发中删除数据通常使用PreparedSta ...

  7. Java为什么把String设计成不可变的(immutable)

    在java中,String是字符串常量,可以从内存,同步机制,数据结构等方面分析 1:字符串中常量池的需要 String不同于普通基础变量类型的地方在于对象.java中的字符串对象都保存在字符串常量池 ...

  8. PuTsangTo-单撸游戏开发01 Flag与计划

    先立下flag,至少1年之内坚持并2年之内完成自己的一个梦想--游戏开发. 没有参加培训也不打算参加培训,就纯靠业余时间自学并用自己的思路完成一整套游戏体系.做出此决心时也已经做好准备烂尾了,但是有种 ...

  9. 快速搭建属于自己的数据库——mongodb

    为了真实模拟一个项目上线,拥有前端后端数据库都具备的功能,我选择了mongodb作为项目的数据库支持,这里分享一些mongodb的经验心得和血的教训. mongoddb安装 在本地安装 直接通过官网下 ...

  10. 初识Hibernate之理解持久化类

         上一篇文章我们简单介绍了Hibernate相关的一些最基本的文件及其作用,并在最后完整的搭建了Hibernate的运行环境,成功的完成了与数据库的映射.但是至于其中的一些更加细节的地方并没有 ...