首先咱们要知道为何要进行对象克隆,我认为最大好处就是提升了效率,你想一想用一个对象须要new一次的效率是很是低的。java
这是基本的关于面向对象的问题,涉及到java内存模型。ide
若是一个类包含的属性都是基本数据类型以及string,integer类型的话,须要用到对象克隆就直接用=就能够,这些数据类型不涉及到栈内存。this
class Person implements Cloneable{ private int num; private String name; public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person [num=" + num + ", name=" + name + "]"; } @Override public Person clone(){ Person p = null; try { p = (Person) super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated cch block e.printStackTrace(); } return p; } } public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Person p = new Person(); p.setNum(1); p.setName("p"); Person pc = p.clone(); pc.setName("pc"); System.out.println(p); System.out.println(pc); } }
这是浅克隆,没什么好说的。code
深克隆就是类中包含引用数据类型的,对象
class Person implements Cloneable{ private int num; private String name; private Date date; public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } @Override public String toString() { return "Person [num=" + num + ", name=" + name + ", date=" + date + "]"; } @Override public Person clone(){ Person p = null; try { p = (Person) super.clone(); p.date = (Date) date.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated cch block e.printStackTrace(); } return p; } } public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Person p = new Person(); p.setNum(1); p.setName("p"); p.setDate(new Date()); Person pc = p.clone(); pc.getDate().setTime(12333); pc.setName("pc"); System.out.println(p); System.out.println(pc); } }
若是没有这一行代码内存
p.date = (Date) date.clone();
在输出时会发现对象PC和P的date属性是一个值,至关于把new date(),从新复制了一遍,而不是指向同一个new date();get