`
kakashi
  • 浏览: 23951 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于clone

    博客分类:
  • java
阅读更多


在java中我们时常会遇到需要对对象进行clone的情况,主要是因为Java的别名效应 如下:

 

SimpleObject a = new SimpleObject(); 
SimpleObject b = a; 
 

这个时候对b进行修改,a也会被改变.这个时候我们就需要对对象进行clone.

单个对象的clone很简单,实现cloneable接口并继承object clone方法就行了

package com.yecg.java.clone;

public class SimpleObject implements Cloneable{
   
	private String property;
    
	public SimpleObject(String property) {
		super();
		this.property = property;
	}

	public String getProperty() {
		return property;
	}

	public void setProperty(String property) {
		this.property = property;
	}
	
	public String toString(){
		return "simple object property is -----"+property;
	}
	
	public Object clone(){
		Object a =null;
		
		try {
			a =super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return a;
	}
	
}

 测试下:

package com.yecg.java.clone;

import java.util.ArrayList;

public class CloneTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//------simple clone
        SimpleObject a  = new SimpleObject("ini");
        SimpleObject b = (SimpleObject)a.clone();
        b.setProperty("clo");
        System.out.println(a);
        System.out.println(b);
       }

}
 结果:simple object property is -----ini

simple object property is -----clo  说明clone生效.

 

需要说明的是.虽然在object中有clone方法,但是是protect,也就是只有在子类中能用,使用a.clone()这种调用方式是不可能实现的.这是因为java要限制clone,并不是每个对象都有clone能力的,如果你想要这个对象拥有clone能力必须要继承这个方法并把它申明为public.

 

复杂对象的clone

这种方式的的clone只能说是浅度clone.为什么说是浅度clone,如果这个对象中还包含其他对象的引用的话,是无法把这个引用的对象也clone了的

举个例子:

package com.yecg.java.clone;

public class ComplexObject implements Cloneable {

	 private String property;
	 
	 private SimpleObject simpleObject;

	public String getProperty() {
		return property;
	}

	public void setProperty(String property) {
		this.property = property;
	}

	public SimpleObject getSimpleObject() {
		return simpleObject;
	}

	public void setSimpleObject(SimpleObject simpleObject) {
		this.simpleObject = simpleObject;
	}
	 
	public Object clone(){
	     Object a =null;
		
		try {
			a =super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return a;
	}
	
    public String toString(){
    	return "ComplexObject  property is ---"+property +" simpleObject property is ---"+simpleObject.getProperty();
    }
}

这里一个复杂的对象ComplexObject包含了一个简单对象SimpleObject的引用  ,clone的方法仍然和前面一样

测试下:

 

package com.yecg.java.clone;

import java.util.ArrayList;

public class CloneTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
        //complex clone
        SimpleObject simple  = new SimpleObject("ini");
        ComplexObject complex = new ComplexObject();
        complex.setProperty("complex_ini");
        complex.setSimpleObject(simple);
        
        ComplexObject complexClone =(ComplexObject)complex.clone();
        complexClone.setProperty("complex_clo");
        complexClone.getSimpleObject().setProperty("clo");
        System.out.println(complex);
        System.out.println(complexClone);
        
 
	}

}
 ComplexObject  property is ---complex_ini simpleObject property is ---clo

ComplexObject  property is ---complex_clo simpleObject property is ---clo

可以看到属性property是确实被clone,但属性simpleObject没有,clone后的simpleObject做了改变

 complexClone.getSimpleObject().setProperty("clo");

会影响到clone之前对象的值. 这就是浅度复制.只复制对象的表层.

 

那怎么进行深度复制呢,只需要改下clone方法:public Object clone(){

		ComplexObject a =null;
		
		try {
			a =(ComplexObject)super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		a.simpleObject =(SimpleObject)a.simpleObject.clone();
		return a;
	}
 

clone自己的同时,也把自己的对象属性进行clone.这就要求你的对象属性必须也要是可以clone的才可以.

集合的clone:

ArrayList里有clone方法,但和复杂对象的clone一样都是浅度clone.怎么深度clone

 

 ArrayList<SimpleObject> objectListClo = (ArrayList<SimpleObject>)objectList.clone();
        for(int i=0;i<objectListClo.size();i++){
        	objectListClo.set(i, (SimpleObject)objectListClo.get(i).clone());
        }

cloneobjectListClo后必须遍历objectListClo里面的每个对象,逐一clone.

分享到:
评论

相关推荐

    java clone

    下面是一些关于`clone`的实践心得: 1. 注意权限:默认情况下,`clone`方法是`protected`的,这意味着在同一个包内的类才能直接调用。如果需要在不同包的类中使用`clone`,需要将它声明为`public`。 2. 避免空指针...

    midi-ch-master_hero_clone_

    在标签中,“hero clone”进一步确认了这是关于Clone Hero游戏的内容。这可能是社区开发的工具,旨在帮助玩家扩展他们的游戏库,通过将MIDI音乐文件转换成游戏可以识别的格式。 压缩包内的文件名 "midi-ch-master" ...

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    java_clone用法

    ### Java中的`clone`方法详解:浅拷贝与深拷贝 #### 一、引言 在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文...

    clone()示例源码

    在标签"java clone()"中,我们可以推断这篇博客可能还讨论了关于Java中对象复制的各种策略,如序列化和反序列化,以及`CopyConstructor`,这些都是创建对象副本的替代方法,特别是当`clone()`不能满足特定需求时。...

    git代码clone,submodule

    以上就是关于 `git clone` 和 `git submodule` 命令以及如何使用它们来管理和维护项目中的子模块的详细介绍。这些命令对于处理大型项目或包含多个子项目的项目非常重要。熟练掌握这些命令可以帮助你更高效地管理工作...

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

    jlink v9 warning clone解决

    标题中的"jlink v9 warning clone解决"意味着开发者正在尝试解决关于JLink v9版本出现的克隆警告。这个警告可能是因为使用了非官方的或者未授权的JLink设备,或者是由于驱动程序或固件版本不兼容导致的。在MDK环境下...

    关于JLINK固件丢失或升级固件后提示Clone的解决办法

    解决 JLINK 固件丢失或升级固件后提示 Clone 的问题 在使用 JLINK 仿真器进行单片机开发时,可能会遇到固件丢失或升级固件后提示 Clone 的问题,本文将提供解决该问题的步骤。 问题描述 使用 JLINK 仿真器时,...

    git clone 最新版

    "git clone"是Git中的一个核心命令,用于复制远程仓库到本地。在本文中,我们将深入探讨`git clone`命令以及如何获取其最新版本。 首先,让我们了解`git clone`的基本用法。当你运行`git clone &lt;repository&gt;`时,它...

    Jlink-clone解决办法,替换文件.rar

    当遇到"Jlink-clone"问题时,这通常指的是遇到了非原厂生产的、可能功能受限或者不稳定版本的J-Link设备。这类克隆设备可能会有兼容性问题、性能下降或不支持某些高级功能。本文将深入探讨如何解决Jlink-clone带来的...

    CLONE 10-ex

    标题“CLONE 10-ex”以及描述“Clone10-EX-LV2”暗示了我们正在处理一个可能与克隆或复制技术相关的项目,可能是软件、系统镜像或者某种形式的数据备份工具。"Clone"通常指的是在计算机科学中创建一个与原始对象完全...

    Clone详解.doc

    Java中的克隆(Clone)机制是一种创建对象副本的方法,它允许程序员复制一个对象的状态,而不会影响原始对象。克隆在编程中常用于创建对象的独立副本,使得新副本与原对象之间相互独立,对其中一个对象的修改不会...

    windows git 批量 clone 脚本

    本文将深入探讨如何利用批处理脚本来实现这一目标,主要关注标题提及的"windows git 批量 clone 脚本"。我们将讨论每个文件的作用,并提供相关知识点。 首先,`clone-all.bat`是用于批量克隆Git仓库的脚本。在Git中...

    Jlink V8固件升级提示Clone的解决方法!

    在使用高版本版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示!“the emulator is JLink-Clone, the segger software only support orginal segger device” 然后闪退,IDE崩溃关闭! 解决方案: 1....

    比nero更完美的刻录CD软件---CLONE_CD

    CLONE_CD是一款专业的CD复制软件,它在刻录领域中被誉为比Nero更为出色的选择,尤其是在数据保护和精确复制方面。这款软件的核心功能是提供无损的CD映像克隆,确保源盘与目标盘的一致性,尤其适用于备份音乐CD、游戏...

    MinesweeperClone汉化版

    Minesweeper CLone 0.97 Saolei.net扫雷网,小门汉化 Men Shiyun Mine.exe 请自行下载MinesweeperClone_0.97.exe安装后使用

    Java中的克隆(Clone)机制

    在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...

    MySQL备份及同步利器-Clone Plugin的原理与实践-2019数据技术嘉年华.pdf

    以下是关于Clone Plugin的详细知识: **01 Clone Plugin功能介绍** Clone Plugin主要提供了两个核心功能:本地克隆(Local Clone)和远程克隆(Remote Clone)。通过执行特定的SQL命令,用户可以直接复制数据目录...

    Java深浅clone

    在Java编程语言中,`Cloneable`接口和`clone()`方法是两个重要的概念,它们用于对象复制。在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让...

Global site tag (gtag.js) - Google Analytics