Java深克隆和浅克隆的原理及实现
来源:互联网 发布:关于知乎的诗词 编辑:程序博客网 时间:2024/05/20 17:42
Java中没有C++中所谓的拷贝构造函数,但是相应地提供了Cloneable接口。在Java中所有类都实现了clone()方法,因为Java中的所有类的父类Object具有clone()方法,而所有Java类都是Object类的子类。某个对象如果想要能够实现克隆,那么该对象的类必须实现cloneable接口。Cloneable接口仅仅只是一个标记接口,不包含任何需要实现的方法。如果某个对象的类没有实现Cloneable接口而调用clone()方法,那么会抛出CloneNotSupportedException。
什么叫浅克隆?什么叫深克隆?克隆就是指将值复制一份到新的对象中,而浅克隆就是对象的引用类型变量复制的是对象的引用值,深克隆就是将引用类型变量所指向的对象内存空间也复制一份给新对象。如下图所示。
如何实现对象的克隆?分三步:
- 对象的类实现Cloneable接口;
- 覆盖Object类的clone()方法;
- 在clone()方法中调用super.clone();
public class ShallowClone implements Cloneable{public int id;public String name;public ShallowClone(int id, String name){this.id = id;this.name = name;}public Object clone(){Object sc = null;try {sc = super.clone();} catch (Exception e) {System.out.println(e.toString());}return sc;}public static void main(String[] args) {// TODO Auto-generated method stubShallowClone sc1 = new ShallowClone(1, "sc1Name");ShallowClone sc2 = (ShallowClone)sc1.clone();System.out.println("sc1's id: " + sc1.id + "\tsc2's id: " + sc2.id);System.out.println("sc1's name: " + sc1.name + "\tsc2's name: " + sc2.name);System.out.println(sc1.name == sc2.name);System.out.println(sc1.name.equals(sc2.name));}}
输出结果:
sc1's id: 1sc2's id: 1sc1's name: sc1Namesc2's name: sc1Nametruetrue
以上只是覆盖了Object类的clone()方法,默认的是浅克隆。String对象复制了其引用值,而不是复制了内存,否则sc1.name == sc2.name为false。
要想实现深克隆很简单,只要引用类型的成员变量所属类也实现Cloneable接口,在clone()方法里对该成员变量也调用它的clone()方法即可。
0 0
- Java深克隆和浅克隆的原理及实现
- Java的深克隆和浅克隆
- java的克隆(深克隆和浅克隆)
- java 深克隆及浅克隆
- JAVA里的深克隆与浅克隆实现
- java深克隆和浅克隆
- java深克隆和浅克隆
- java 深克隆和浅克隆区别
- java中的深克隆和浅克隆
- JAVA中的深克隆和浅克隆
- java 深克隆和浅克隆
- Java中的浅克隆和深克隆
- java浅克隆和深克隆
- 理解Java浅克隆和深克隆
- java对象克隆(浅克隆和深克隆)
- java克隆之深克隆和浅克隆
- Java(对象的深克隆和浅克隆)
- Java对象的浅克隆和深克隆
- CEGUI自定义控件的几个关键步骤
- HDOJ 2058 The sum problem
- socket编程UDP小例子
- 使用 Shell 脚本自动化 Linux 系统维护任务
- 《leetCode》:Isomorphic Strings
- Java深克隆和浅克隆的原理及实现
- POJ 3768 Repeater
- Git远程操作详解
- iOS如何上传代码到Github
- 三种ViewController跳转的异同(两种转场动画的实现待总结)
- 【Linux学习】epoll详解
- ZooKeeper的工作流程
- UVa 679 Dropping Balls
- 对象数组