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 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

 并没有改变原来的值了

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值