java 克隆clone学习

系统 1612 0

文章参考 :http://www.java3z.com/cwbwebhome/article/article8/81145.html?id=2600

 

Java Object类 提供了一个 protected 修饰的clone()方法,该方法用于帮助其他对象来实现“自我克隆”,所谓“自我克隆”就是得到一个当前对象的副本,而且两者之间完全隔离, 该方法只能被子类重写或调用

 

自定义类实现“克隆”的步骤:

1、自定义类实现Cloneable接口;(这是个 标记性接口 ,实现该接口对象可以实现“自我克隆”,接口里没有定义任何方法,否则不能执行clone方法)

2、自定义类实现自己的clone()方法

3、实现clone()方法时通过super.clone();调用Object实现的clone()方法来得到该对象的副本,并返回该副本。

 

备注: 标记性接口是没有任何方法和属性的接口。它仅仅表明他的类属于一个特定的类型,供其他代码来测试允许做一些事情。使用标记性接口的唯一目的是使得可以用instanceof进行类型查询 ,例如:

if(obj instanceof Cloneable){......}

一些容器例如EJB容器,servlet容器或运行环境依赖标记接口识别类是否需要进行某种处理,例如serialiable接口标记类需要进行序列化操作。

 

 

      package hb.com.clone;

class Address{
	String detail;
	public Address(String detail){
		this.detail = detail;
	}
	
	public String getDetail() {
		return detail;
	}

	public void setDetail(String detail) {
		this.detail = detail;
	}

	public String print(){
		System.out.println(this.detail);
		return this.detail;
	}
	
}

    

 

      package hb.com.clone;

public class User implements Cloneable{
	 
	public int age;
	public Address address;
	public User(int age){
		this.age = age;
		this.address = new Address("地名");
	}
	 
	public User clone(){
		try {
			return (User)super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}
}
    

 

      public class CloneTest {
 
	public static void main(String[] args) {
	User u1 = new User(29);  
        //u1克隆之后,会单独开辟一块内存空间,u2指向的地址与u1不一致
//      x.clone() != x 
//		x.clone().getClass() == x.getClass() 
//		x.clone().equals(x) 
        User u2 = u1.clone();  
        System.out.println(u1==u2);  //false
        
//		primitive的确做到了相等且隔离。 
//		引用类型仅仅是复制了一下引用
        System.out.println(u1.address ==u2.address);  //true
           
        //值相等,实际上内存不是指向同一个位置
        System.out.println(u1.age == u2.age); 
        
        System.out.println(u1.address.print());
        u1.address.setDetail("地名1");
        System.out.println(u1.address.print());
        System.out.println(u2.address.print());
	}
 
}
    

  java 克隆clone学习

 

Object类的clone()方法虽然简单、易用,但它只是一种“ 潜克隆 ”—— 它只克隆该对象的所有Field值,不会对引用类型的Field值所引用的对象克隆 。如果需要“ 深克隆 ”,则需要开发者自己进行“递归”克隆,保证所有引用类型的Field值所引用的对象都被复制了。

java 克隆clone学习


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论