一.JAVA假克隆

Java中,对于基本类型,可以用“=”进行克隆,而对于引用类型却不能简单的使用“=”进行克隆,这与JAVA的内存使用空间有关,JAVA在栈中保存基本类型和引用变量,在堆中保存对象。对于引用变量而言,使用“=”将修改引用,而不是复制堆中的对象,此时两个引用对象将指向同一个对象,因此如果对一个变量修改则会修改另一个对象。

public class Employee

{

private String name;

private int age; //省略get和set方法

@Override

public String toString()

{

return "姓名:" + name + ", 年龄:" + age;

}

}

public class Test

{   public static void main(String[] args)

{ System.out.println("克隆之前:");

Employee employee1 = new Employee();

employee1.setName("芋头1");

employee1.setAge(12);

System.out.println("员工1的信息:");

System.out.println(employee1);

System.out.println("克隆之后:");

Employee employee2 = employee1;

employee2.setName("芋头2");

employee2.setAge(114);

System.out.println("员工2的信息:");

System.out.println(employee2);

System.out.println("员工1的信息:");

System.out.println(employee1); } }

输出:

克隆之前:

员工1的信息:

姓名:芋头1, 年龄:12

克隆之后:

员工2的信息:

姓名:芋头2, 年龄:114

员工1的信息:

姓名:芋头2, 年龄:114

可以看出,employee1和employ2两个引用变量同时指向一个对象,当修改employee2的域时,employee11的域也被修改,因此是假克隆。

二、浅克隆

protect Object clone() 通常需要改写该方法并把访问权限限定为public,该方法对于类中的每个域,如果只包含基本类型和不可变的引用类型,如string,或者对象在其生命周期内不可变化,则可以用浅克隆来复制对象。

public class Address

{    private String state;

private String province;

private String city; //省略get和set

@Override

public String toString()

{

StringBuilder sb = new StringBuilder();

sb.append("国家:" + state + ", ");

sb.append("省:" + province + ", ");

sb.append("市:" + city);

return sb.toString();

}

}

学习群64弍46衣3凌9,资料群69似64陆0吧3

public class Employee implements Cloneable

{

private String name;

private int age;

private Address address; //省略get和set

@Override public String toString()

{

StringBuilder sb = new StringBuilder();

sb.append("姓名:" + name + ", ");

sb.append("年龄:" + age + "\n");

sb.append("地址:" + address); return sb.toString(); }

@Override public Employee clone()

{

Employee employee = null;

try {

employee = (Employee) super.clone();

} catch (CloneNotSupportedException e)

{ e.printStackTrace(); } return employee; }

}

public class Test

{

public static void main(String[] args)

{

System.out.println("克隆之前:");

Address address = new Address("中国", "吉林", "长春");

Employee employee1 = new Employee("明日科技", 12, address);

System.out.println("员工1的信息:");

System.out.println(employee1);

System.out.println("克隆之后:");

Employee employee2 = employee1.clone();

employee2.getAddress().setState("中国");

employee2.getAddress().setProvince("四川");

employee2.getAddress().setCity("成都");

employee2.setName("西南交通大学");

employee2.setAge(114);

System.out.println("员工2的信息:");

System.out.println(employee2);

System.out.println("员工1的信息:");

System.out.println(employee1); } }

输出:

克隆之前:

员工1的信息:

姓名:明日科技, 年龄:12 地址:国家:中国, 省:吉林, 市:长春

克隆之后:

员工2的信息:

姓名:西南交通大学, 年龄:114 地址:国家:中国, 省:四川, 市:成都

员工1的信息:

姓名:明日科技, 年龄:12 地址:国家:中国, 省:四川, 市:成都

我们发现,employee类中又包含了Adress类adress的引用,我们知道,clone方法默认的是浅克隆,即不会克隆对象引用的对象,而只是简单地复制这个引用。所以在上例中,adress对象在内存中只有一个,employee1和employee2都指向它,任何一个对象对它的修改都会影响另一个对象。所以adress的值也被修改了。

三,深克隆

一种就是在引用类型中添加克隆方法。如对上面的浅克隆代码改成:

在Adress类中增加 protected Address clone() { Address address = null; try { address = (Address) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return address; }

Employee中:复制代码 public Employee clone() { Employee employee = null; try { employee = (Employee) super.clone(); employee.address = address.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); }

输出:

克隆之前:

员工1的信息:

姓名:明日科技, 年龄:12 地址:国家:中国, 省:吉林, 市:长春 克隆之后:

员工2的信息:

姓名:西南交通大学, 年龄:114 地址:国家:中国, 省:四川, 市:成都

员工1的信息:

姓名:明日科技, 年龄:12 地址:国家:中国, 省:吉林, 市:长春

实现了深克隆 一个方法自然是重写clone方法,添加如order.items=(LineItems)items.clone()的语句,也就是人为地添加对引用对象的复制。这个方法的缺点是如果引用对象有很多,或者说引用套引用很多重,那么太麻烦了。业界常用的方法是使用串行化然后反串行化的方法来实现深克隆。由于串行化后,对象写到流中,所有引用的对象都包含进来了,所以反串行化后,对等于生成了一个完全克隆的对象。 这个方法的要求是对象(包括被引用对象)必须事先了Serializable接口,否则就要用transient关键字将其排除在复制过程中。

JAVA之假克隆、浅克隆、深克隆相关推荐

  1. Java的假克隆和真克隆(1)

    在实际的编程中可能会碰见需要克隆的地方,这里对假克隆和真克隆(浅克隆)做一个简单的记录和分析 假克隆的代码: public class Employee {private String name;pr ...

  2. Java对象克隆——浅克隆和深克隆的区别

    在Java中对象的克隆有深克隆和浅克隆之分.有这种区分的原因是Java中分为基本数据类型和引用数据类型,对于不同的数据类型在内存中的存储的区域是不同的.基本数据类型存储在栈中,引用数据类型存储在堆中. ...

  3. 【重难点】【Java基础 06】浅克隆与深克隆、Object类的常用方法、util包下的接口

    [重难点][Java基础 06]浅克隆与深克隆.Object对象的常用方法.util包下的接口 文章目录 [重难点][Java基础 06]浅克隆与深克隆.Object对象的常用方法.util包下的接口 ...

  4. java中的深度克隆浅克隆_了解Java中的可克隆接口

    java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...

  5. java,对象的克隆

    这次写的是有关java对象的克隆 首先是 java对象的假克隆 对于基本类型我们可以用"="来进行克隆,此时对于两个变量除了相等没有其他的关系 但对于引用类型来说就不能简单的使用& ...

  6. java对象序列化克隆_JAVA 对象克隆和序列化

    先用一个例子来说明假克隆吧,也就是用"="之后的效果.. [运行结果]: [运行结果] 姓名:rollen年龄:20 姓名:hello world年龄:100 姓名:hello w ...

  7. Java序列化和克隆

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java序列化和克隆,更多Java专业知识,广州疯狂java培训官网与你 ...

  8. 【JAVA零基础入门系列】Day14 Java对象的克隆

    [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...

  9. Java中如何克隆集合——ArrayList和HashSet深拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法 ...

  10. Java的“影子克隆”和“深度克隆”

    今天来学习学习java对象的克隆,在写代码的时候,有时候我们会这样写:对象1=对象2,也就是把对象2赋值给对象1了,但是这样做有个问题,就是如果我们修改了对象2的属性值,对象1的相同属性值也被修改了, ...

最新文章

  1. 网络测试与分析工具简介
  2. 关于java的public,private,protect,以及默认权限的理解
  3. vue js 工具方法封装js 文件
  4. 牛顿法与拟牛顿法,SDM方法的一些注记
  5. php常驻对象,php对象
  6. python中向类中动态添加新特性及删除属性方法
  7. Silverlight通过Wcf Data Service访问数据库之ADO.NET Entity Framework篇
  8. Xcode 清除最近使用纪录
  9. 开发环境ubuntu16.04常用工具和设置(git、ssh、python、sh、java、Maven、mysql、postgresql)
  10. 两堆草前饿死的驴——选择永远是件痛苦的事
  11. mac电脑用计算机名共享打印机,苹果电脑怎么连接共享打印机_苹果电脑连接共享打印机的具体教程-系统城...
  12. 【PageHelper分页】实现拦截pageNum和pageSize
  13. 【分享】我在名牌大学毕业后的经历
  14. 投入产出模型中的经济分析(直接消耗系数等)
  15. NetLimiter 4.0.15.0 x64 破解新鲜出炉!
  16. Java实现图书管理小练习(赌包辣条看完绝对会~)
  17. 自动清理内存linux,linux 过滤内存使用率并于计划任务结合来自动清理内存缓存...
  18. 计算机图形学直线算法程序,计算机图形学直线生成算法实现.doc
  19. Tita OKRs-E 使OKR成为您企业DNA一部分
  20. 已知先序和中序序列求二叉树

热门文章

  1. 高压带电显示器局放检测面板式四合一局放在线监测/带电故障显示/无线测温装置
  2. Spring AOP内部方法调用代理失效
  3. linux秘钥登录使用authorized_keys不生效
  4. Driver error 11
  5. Lab: Username enumeration via different responses:通过不同的响应来验证用户名是否正确复盘
  6. Kmeans参数n_clusters_labels_centers_
  7. OCUI界面设计:导航控制器
  8. Joyoshare Media Cutter for Mac(智能媒体剪辑软件)激活版
  9. 服务器临时文件定时清理,定时/开机自动清理Win10临时文件夹的技巧
  10. 可以下载视频的手机浏览器