读书人

java基础 克隆的使用

发布时间: 2012-09-06 10:37:01 作者: rapoo

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

?并没有改变原来的值了

?

?

?

?

?

?

读书人网 >编程

热点推荐