Java的深度克隆和浅度克隆
2014-04-08 12:11
232 查看
说到克隆,其实是个比较简单的概念,跟现实生活正的克隆一样,复制一个一模一样的对象出来。clone()这个方法是从Object继承下来的,一个对象要实现克隆,需要实现一个叫做Cloneable的接口,这个接口没有什么方法,和Comparable接口差不多,仅仅是起一个标志作用,实现了这个接口你就能实现克隆操作。
这里有两个概念,深度克隆和浅度克隆,这东西虽然平常不怎么用,但是了解一下还是有必要的。Object中的克隆方法是浅度克隆,JDK规定了克隆需要满足的一些条件,简要总结一下就是:对某个对象进行克隆,对象的的成员变量如果包括引用类型或者数组,那么克隆的时候其实是不会把这些对象也带着复制到克隆出来的对象里面的,只是复制一个引用,这个引用指向被克隆对象的成员对象,但是基本数据类型是会跟着被带到克隆对象里面去的。而深度可能就是把对象的所有属性都统统复制一份新的到目标对象里面去。简单画个图:
写了几行代码测试一下:(针对数组,对象其实跟数组是一样的)
而如果要进行所谓的深度克隆,在重写clone方法的时候把属性也克隆一下,也就是上面代码的去掉17行注释。
这里有两个概念,深度克隆和浅度克隆,这东西虽然平常不怎么用,但是了解一下还是有必要的。Object中的克隆方法是浅度克隆,JDK规定了克隆需要满足的一些条件,简要总结一下就是:对某个对象进行克隆,对象的的成员变量如果包括引用类型或者数组,那么克隆的时候其实是不会把这些对象也带着复制到克隆出来的对象里面的,只是复制一个引用,这个引用指向被克隆对象的成员对象,但是基本数据类型是会跟着被带到克隆对象里面去的。而深度可能就是把对象的所有属性都统统复制一份新的到目标对象里面去。简单画个图:
写了几行代码测试一下:(针对数组,对象其实跟数组是一样的)
class Person implements Cloneable { String name; String password; String[] arrFavor; public Person(String name, String password, String[] arrFavor) { this.name = name; this.password = password; this.arrFavor = arrFavor; } @Override protected Object clone() { Person person = null; try { person = (Person) super.clone(); // person.arrFavor = arrFavor.clone(); return person; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } } public class Test4 { public static void main(String[] args) { String[] arrFavor = { "basketball", "football" }; Person person = new Person("Jay", "123", arrFavor); Person p = (Person) person.clone(); System.out.println(p.name); System.out.println(p.password); p.name = "Jolin"; p.password = "555"; p.arrFavor[0] = "valiball"; for (String favor : p.arrFavor) { System.out.print(favor + " "); } System.out.println(); for (String favor : person.arrFavor) { System.out.print(favor + " "); } System.out.println(); } } // 结果 // Jay // 123 // valiball football // valiball football
而如果要进行所谓的深度克隆,在重写clone方法的时候把属性也克隆一下,也就是上面代码的去掉17行注释。
相关文章推荐
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆
- 关于Java深度克隆和浅度克隆的简单说明
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆
- 浅谈java对象浅度克隆和深度克隆
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆
- Java浅度克隆和深度克隆
- Java 中的浅度克隆与深度克隆(测试用例)
- 解析JAVA深度克隆与浅度克隆的区别详解
- Java的深度克隆和浅度克隆
- Java中的clone() 浅克隆与深度克隆
- 深入JAVA对象深度克隆的详解
- Java clone() 浅克隆与深度克隆
- Java clone() 浅克隆与深度克隆
- Java 深度克隆与浅克隆
- Java 基础数据类型 和 深度克隆对象的2种方法(实现Cloneable接口或者实现对象序列化)
- Java浅克隆和深度克隆
- JAVA对象任意深度克隆clone工具类分享
- java 深度克隆
- Java的赋值、浅克隆和深度克隆的区别