java基础 克隆的应用
好吧,我先来说,这个不知道再实际的开发中用的大不大。
?
克隆分为浅克隆和深克隆,两者的区别就是克隆后的对象,修改对象中引用的属性的时候,是不是会影响到原来的那个对象。
恩,你一定很糊涂了。
?
?
首先来说浅克隆:
我有一个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 blocke.printStackTrace();}return object ;}}?
//我们要实现的就是这个方法,然后用clone的方法就可以了,就是克隆这个people了public Object clone() {Object object = null;try {object = super.clone();} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.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
?并没有改变原来的值了
?
?
?
?
?
?