好吧,我先来说,这个不知道再实际的开发中用的大不大。
克隆分为浅克隆和深克隆,两者的区别就是克隆后的对象,修改对象中引用的属性的时候,是不是会影响到原来的那个对象。
恩,你一定很糊涂了。
首先来说浅克隆:
我有一个people类,里面有三个属性,一个是学号,一个名字,一个是身份证,身份证又是一个类,里面有两个属性一个是
身份证号码,一个身份证的发证机关的名字。
我首先创建了一个people对象,然后我克隆一份,那么这一份是和克隆前的对象有相同的属性值得。但是如果我改变了people的引用对象的属性值,两个都会是影响到得,而改变的基本类型的,8个基本类型的话,是不会影响到的。
克隆的实现要实现一个接口,然后覆盖clone的方法就可以了的。
创建一个people并且实现接口,接口是定义型的接口,并不须要实现一些方法的:
card类:
package endual.copy; public class Card { private int id ; private String name ; public Card(int id, String name) { super(); this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } // public Object clone() throws CloneNotSupportedException { // // Object obj = super.clone() ; // return obj ; // // } }
People.java
package endual.copy; public class People implements Cloneable{ private int id ; private String name ; private Card card ; public People(int id, String name, Card card) { super(); this.id = id; this.name = name; this.card = card; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Card getCard() { return card; } public void setCard(Card card) { this.card = card; } public Object clone() { Object object = null; try { object = super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return object ; } }
//我们要实现的就是这个方法,然后用clone的方法就可以了,就是克隆这个people了 public Object clone() { Object object = null; try { object = super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return object ; }
main类
package endual.copy; /** * 深克隆的概念 * 深复制或者叫深克隆:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。 * 那些引用其他对象的变量将指向被复制过的新对象,而不在是原来有的那些被引用的对象。换言之,深复制把要复制的对象 * 所引用的对象都复制了一遍。也就是说,我复制的对象改变的话,是不会影响到我原来引用的对象的。 * */ public class CloneAoo { public static void main(String[] args) { Card card = new Card (123456, "浙江杭州派出所") ; People p = new People(98765,"xxx", card) ; People pp = (People) p.clone() ; //克隆了一个pp对象,但是里面有一个引用的是card的,而其他是基本类型的 System.out.println(pp.getCard().getName()) ; //打印是一样的 System.out.println(pp.getCard().getId()); //打印是一样的 pp.getCard().setName("中国建设银行"); //改变掉card的属性 pp.setId(33) ; //改变掉基本的属性 System.out.println(p.getCard().getName()); //打印p对象的引用card的值就变了 System.out.println(p.getId()); //这个没变化 //Clone clone = new Clone() ; } }
结果分析:
杭州派出所 123456 中国建设银行 98765
浅克隆可以理解为克隆的对象如果里面有引用的属性的话,那么用的是同一份属性的值,如果改变掉其中一份的属性值得话,就会影响到其他的对象的引用的。
--------------------------------------------------------------------
而可能就是完全的克隆一份了,互不相关的一份克隆了的。
这个要用的序列化了,首先将对象序列化到文件或者xml,然后再反序列化回来,这样就是一个新的对象了,里面的引用是新创建的。
还有一种复制就是将引用也复制一份就可以了
要么我们也要实现card的clone的克隆的方法:
package endual.copy; public class Card implements Cloneable{ private int id ; private String name ; public Card(int id, String name) { super(); this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Object clone() throws CloneNotSupportedException { Object obj = super.clone() ; return obj ; } }
people类
package endual.copy; public class People implements Cloneable{ private int id ; private String name ; private Card card ; public People(int id, String name, Card card) { super(); this.id = id; this.name = name; this.card = card; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Card getCard() { return card; } public void setCard(Card card) { this.card = card; } public Object clone() throws CloneNotSupportedException { People pp = (People)super.clone() ; pp.setCard((Card)pp.getCard().clone()) ; return pp; } }
main类
package endual.copy; /** * 深克隆的概念 * 深复制或者叫深克隆:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。 * 那些引用其他对象的变量将指向被复制过的新对象,而不在是原来有的那些被引用的对象。换言之,深复制把要复制的对象 * 所引用的对象都复制了一遍。也就是说,我复制的对象改变的话,是不会影响到我原来引用的对象的。 * */ public class CloneAoo { public static void main(String[] args) throws CloneNotSupportedException { Card card = new Card (123456, "杭州派出所") ; People p = new People(98765,"xxx", card) ; People pp = (People) p.clone() ; System.out.println(pp.getCard().getName()) ; System.out.println(pp.getCard().getId()); pp.getCard().setName("中国建设银行"); pp.setId(33) ; System.out.println(p.getCard().getName()); System.out.println(p.getId()); Object obj = new Object() ; //Clone clone = new Clone() ; } }
测试结果是:
杭州派出所 123456 杭州派出所 98765
并没有改变原来的值了