在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());
}
clone了objectListClo后必须遍历objectListClo里面的每个对象,逐一clone.
分享到:
相关推荐
下面是一些关于`clone`的实践心得: 1. 注意权限:默认情况下,`clone`方法是`protected`的,这意味着在同一个包内的类才能直接调用。如果需要在不同包的类中使用`clone`,需要将它声明为`public`。 2. 避免空指针...
在标签中,“hero clone”进一步确认了这是关于Clone Hero游戏的内容。这可能是社区开发的工具,旨在帮助玩家扩展他们的游戏库,通过将MIDI音乐文件转换成游戏可以识别的格式。 压缩包内的文件名 "midi-ch-master" ...
Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....
### Java中的`clone`方法详解:浅拷贝与深拷贝 #### 一、引言 在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文...
在标签"java clone()"中,我们可以推断这篇博客可能还讨论了关于Java中对象复制的各种策略,如序列化和反序列化,以及`CopyConstructor`,这些都是创建对象副本的替代方法,特别是当`clone()`不能满足特定需求时。...
以上就是关于 `git clone` 和 `git submodule` 命令以及如何使用它们来管理和维护项目中的子模块的详细介绍。这些命令对于处理大型项目或包含多个子项目的项目非常重要。熟练掌握这些命令可以帮助你更高效地管理工作...
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...
标题中的"jlink v9 warning clone解决"意味着开发者正在尝试解决关于JLink v9版本出现的克隆警告。这个警告可能是因为使用了非官方的或者未授权的JLink设备,或者是由于驱动程序或固件版本不兼容导致的。在MDK环境下...
解决 JLINK 固件丢失或升级固件后提示 Clone 的问题 在使用 JLINK 仿真器进行单片机开发时,可能会遇到固件丢失或升级固件后提示 Clone 的问题,本文将提供解决该问题的步骤。 问题描述 使用 JLINK 仿真器时,...
"git clone"是Git中的一个核心命令,用于复制远程仓库到本地。在本文中,我们将深入探讨`git clone`命令以及如何获取其最新版本。 首先,让我们了解`git clone`的基本用法。当你运行`git clone <repository>`时,它...
当遇到"Jlink-clone"问题时,这通常指的是遇到了非原厂生产的、可能功能受限或者不稳定版本的J-Link设备。这类克隆设备可能会有兼容性问题、性能下降或不支持某些高级功能。本文将深入探讨如何解决Jlink-clone带来的...
标题“CLONE 10-ex”以及描述“Clone10-EX-LV2”暗示了我们正在处理一个可能与克隆或复制技术相关的项目,可能是软件、系统镜像或者某种形式的数据备份工具。"Clone"通常指的是在计算机科学中创建一个与原始对象完全...
Java中的克隆(Clone)机制是一种创建对象副本的方法,它允许程序员复制一个对象的状态,而不会影响原始对象。克隆在编程中常用于创建对象的独立副本,使得新副本与原对象之间相互独立,对其中一个对象的修改不会...
本文将深入探讨如何利用批处理脚本来实现这一目标,主要关注标题提及的"windows git 批量 clone 脚本"。我们将讨论每个文件的作用,并提供相关知识点。 首先,`clone-all.bat`是用于批量克隆Git仓库的脚本。在Git中...
在使用高版本版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示!“the emulator is JLink-Clone, the segger software only support orginal segger device” 然后闪退,IDE崩溃关闭! 解决方案: 1....
CLONE_CD是一款专业的CD复制软件,它在刻录领域中被誉为比Nero更为出色的选择,尤其是在数据保护和精确复制方面。这款软件的核心功能是提供无损的CD映像克隆,确保源盘与目标盘的一致性,尤其适用于备份音乐CD、游戏...
Minesweeper CLone 0.97 Saolei.net扫雷网,小门汉化 Men Shiyun Mine.exe 请自行下载MinesweeperClone_0.97.exe安装后使用
在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...
以下是关于Clone Plugin的详细知识: **01 Clone Plugin功能介绍** Clone Plugin主要提供了两个核心功能:本地克隆(Local Clone)和远程克隆(Remote Clone)。通过执行特定的SQL命令,用户可以直接复制数据目录...
在Java编程语言中,`Cloneable`接口和`clone()`方法是两个重要的概念,它们用于对象复制。在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让...