Java克隆
- 格式:docx
- 大小:18.04 KB
- 文档页数:6
java 对象克隆方法Java中的对象克隆方法是一种非常重要的技术,它允许我们创建一个与原始对象相同的副本,而不是简单地引用同一个对象。
这个克隆方法可以在很多场景中发挥作用,例如在多线程环境下保护数据完整性,或者在某些设计模式中使用。
本文将一步一步回答关于Java对象克隆方法的主题,并详细讨论它的实现。
第一步:了解Java中的浅克隆和深克隆在Java中,对象克隆可以分为两种类型:浅克隆和深克隆。
浅克隆只复制对象的引用,而不复制对象本身。
这意味着原始对象和克隆对象将共享相同的引用。
另一方面,深克隆会复制对象及其所有引用的对象,以及它们的引用,以此类推。
这样,原始对象和克隆对象是完全独立的。
第二步:实现对象克隆的方式在Java中,要实现对象克隆,我们可以使用两种方式:使用Cloneable 接口和实现Serializable接口。
Cloneable接口是一个标记接口,它表示该类可以被克隆。
实现Cloneable接口后,我们需要重写Object类的clone()方法来实现具体的克隆逻辑。
另一方面,实现Serializable接口可以使用Java的序列化机制来实现对象的克隆。
通过将对象写入字节流,然后将字节流读出为新的对象,我们可以实现对象的深克隆。
第三步:使用Cloneable接口进行对象克隆要使用Cloneable接口进行对象克隆,我们首先需要确保目标类实现了Cloneable接口,并在类的声明中使用super.clone()调用Object类的clone()方法。
这将返回一个浅克隆的对象,我们需要进行一些额外的步骤来实现深克隆。
首先,我们需要将原始对象的引用类型属性也实现Cloneable接口,并在clone()方法中调用它们的clone()方法。
这样,我们就可以逐层复制对象的引用类型属性。
然后,我们可以返回克隆的对象。
第四步:使用Serializable接口进行对象克隆要使用Serializable接口进行对象克隆,我们需要确保目标类实现了Serializable接口。
一、介绍在日常的软件开发工作中,使用Git作为版本控制工具已经成为了标配。
Git可以帮助开发团队协作,管理代码的版本,以及追踪代码的变化。
在Java开发中,经常需要从Git仓库中克隆项目代码到本地开发环境中进行修改和测试。
本文将介绍在Java代码中如何通过命令行或者使用Java API来克隆Git项目。
二、使用命令行克隆Git项目1.安装Git要在命令行中使用Git命令,首先需要在本地计算机上安装Git软件。
可以从Git冠方全球信息站(网络协议sxxx)上下载适合自己操作系统的安装包,并按照冠方文档进行安装。
2.打开命令行安装完成Git软件后,在命令行中输入以下命令来检查Git是否成功安装:git --version如果成功安装,命令行将会输出Git的版本信息。
3.克隆Git项目在命令行中进入到想要克隆项目的目录,使用以下命令来克隆Git项目:git clone <git仓库位置区域>其中,<git仓库位置区域>是需要克隆的项目的Git仓库位置区域。
执行该命令后,Git将会从远程仓库中下载项目代码到本地目录。
三、使用Java API克隆Git项目除了在命令行中使用Git命令来克隆项目外,Java程序员还可以使用JGit这个开源的Git库来在Java代码中操作Git。
下面将介绍如何在Java代码中使用JGit来克隆Git项目。
1.添加JGit库依赖首先需要在Java项目的依赖管理工具中添加JGit库的依赖项。
如果使用Maven作为项目的构建工具,可以在项目的pom.xml文件中添加以下依赖项:<dependency><groupId>org.eclipse.jgit</groupId><artifactId>org.eclipse.jgit</artifactId><version>5.6.1.xxx-r</version></dependency>如果使用Gradle作为项目的构建工具,可以在项目的build.gradle 文件中添加以下依赖项:implementation 'org.eclipse.jgit:org.eclipse.jgit:5.6.1.xxx-r'2.克隆Git项目在Java代码中,使用JGit库的API来克隆Git项目十分简单。
java中clone的用法(一)Java中clone的用法概述在Java中,clone是一种用于复制对象的操作。
通过使用clone方法,可以创建一个新的对象,该对象的值和被复制对象相同,但是它们是两个独立的实例。
在使用clone方法时,需要注意一些规则和注意事项。
用法以下是Java中clone的一些常见用法:1.实现Cloneable接口:Java中的clone方法是定义在Cloneable接口中的。
在使用clone方法之前,需要确保被复制的对象的类实现了Cloneable接口,并且重写了clone方法。
否则,在调用clone方法时会抛出CloneNotSupportedException异常。
2.重写clone方法:在复制对象时,需要重写clone方法。
重写clone方法时,应该先调用方法获得被复制对象的副本,然后再对需要改变的属性进行相应修改。
@Overrideprotected Object clone() throws CloneNotSupportedEx ception {// 调用父类的clone方法获取被复制对象的副本MyClass cloned = (MyClass) ();// 对需要改变的属性进行相应修改= ();return cloned;}3.浅拷贝和深拷贝:在默认情况下,clone方法执行的是浅拷贝,即复制对象的字段,但是不复制引用对象本身。
如果需要实现深拷贝,即复制引用对象本身,需要在clone方法中手动对引用对象进行克隆。
4.使用clone方法复制对象:使用clone方法复制对象时,可以通过调用被复制对象的clone方法实现。
被复制对象的类应该实现Cloneable接口并重写clone方法。
MyClass original = new MyClass();MyClass cloned = ();5.clone方法的返回类型:clone方法的返回类型是Object,因此在使用复制后的对象时,需要进行类型转换。
4种java文件复制的方法在Java中,复制文件有多种方法,这里提供四种常见的方法:1. 使用``包中的`Files`类这是Java 7及以后版本中推荐的方法,因为它使用了异步I/O操作,性能更好。
```javaimport ;public class FileCopy {public static void main(String[] args) {Path source = ("");Path target = ("");try {(source, target, _EXISTING);} catch (IOException e) {();}}}```2. 使用``包中的`FileInputStream`和`FileOutputStream`这是较旧的方法,适用于较小的文件。
对于大文件,这种方法可能效率较低,因为它一次读取整个文件。
```javaimport ;public class FileCopy {public static void main(String[] args) {File source = new File("");File target = new File("");try (FileInputStream fis = new FileInputStream(source);FileOutputStream fos = new FileOutputStream(target)) {byte[] buffer = new byte[1024];int length;while ((length = (buffer)) > 0) {(buffer, 0, length);}} catch (IOException e) {();}}}```3. 使用``包中的`FileChannel`这也是一种效率较高的方法,适用于大文件。
java 深度复制对象的方法(实用版6篇)目录(篇1)1.深度复制和浅度复制的区别2.Java 中实现深度复制的方法3.使用 Serialization 实现深度复制4.使用 Cycle 检测实现深度复制5.使用递归实现深度复制6.使用 Apache Commons Lang 库实现深度复制正文(篇1)在 Java 中,复制对象是一个常见的操作。
然而,Java 中的复制操作通常分为深度复制和浅度复制。
浅度复制仅仅是复制对象的基本信息,而不复制对象的引用类型成员。
深度复制则需要递归地复制对象的所有成员,包括引用类型成员。
下面我们将介绍几种在 Java 中实现深度复制的方法:1.使用 Serialization 实现深度复制。
Serialization 是 Java 提供的一种对象持久化的机制,它可以将 Java 对象序列化为字节数组,然后再将字节数组反序列化为对象。
通过这种方式,我们可以实现对象的深度复制。
示例代码如下:```javaimport java.io.*;public class DeepCopy {public static void main(String[] args) throws IOException {Person original = new Person("John", 25);Person copy = deepCopy(original);System.out.println(copy.getName());}public static Object deepCopy(Object original) throws IOException {if (original == null) {return null;}ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = newObjectOutputStream(bos);oos.writeObject(original);ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));return ois.readObject();}}```2.使用 Cycle 检测实现深度复制。
Java对象的复制三种⽅式Java对象的复制三种⽅式概述在实际编程过程中,我们常常要遇到这种情况:有⼀个对象A,在某⼀时刻A中已经包含了⼀些有效值,此时可能会需要⼀个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独⽴的对象,但B的初始值是由A对象确定的。
例如下⾯程序展⽰的情况:结果:为什么改变学⽣2的学号,学⽣1的学号也发⽣了变化呢?原因出在(stu2 = stu1) 这⼀句。
该语句的作⽤是将stu1的引⽤赋值给stu2,这样,stu1和stu2指向内存堆中同⼀个对象。
如图:那么,怎么能⼲⼲净净清清楚楚地复制⼀个对象呢。
在 Java语⾔中,⽤简单的赋值语句是不能满⾜这种需求的。
要满⾜这种需求有很多途径,(1)将A对象的值分别通过set⽅法加⼊B对象中;(2)通过重写ng.Object类中的⽅法clone();(3)通过mons中的⼯具类BeanUtils和PropertyUtils进⾏对象复制;(4)通过序列化实现对象的复制。
2.将A对象的值分别通过set⽅法加⼊B对象中对属性逐个赋值,本实例为了演⽰简单就设置了⼀个属性:我们发现,属性少对属性逐个赋值还挺⽅便,但是属性多时,就需要⼀直get、set了,⾮常⿇烦。
3.重写ng.Object类中的⽅法clone()先介绍⼀下两种不同的克隆⽅法,浅克隆(ShallowClone)和深克隆(DeepClone)。
在Java语⾔中,数据类型分为值类型(基本数据类型)和引⽤类型,值类型包括int、double、byte、boolean、char等简单数据类型,引⽤类型包括类、接⼝、数组等复杂类型。
浅克隆和深克隆的主要区别在于是否⽀持引⽤类型的成员变量的复制,下⾯将对两者进⾏详细介绍。
3.1浅克隆⼀般步骤:1.被复制的类需要实现Clonenable接⼝(不实现的话在调⽤clone⽅法会抛出CloneNotSupportedException异常),该接⼝为标记接⼝(不含任何⽅法)2.覆盖clone()⽅法,访问修饰符设为public。
Java复制(拷贝)数组的4种⽅...所谓复制数组,是指将⼀个数组中的元素在另⼀个数组中进⾏复制。
本⽂主要介绍关于 Java ⾥⾯的数组复制(拷贝)的⼏种⽅式和⽤法。
在 Java 中实现数组复制分别有以下 4 种⽅法:Arrays 类的 copyOf() ⽅法Arrays 类的 copyOfRange() ⽅法System 类的 arraycopy() ⽅法Object 类的 clone() ⽅法下⾯来详细介绍这 4 种⽅法的使⽤。
使⽤ copyOf() ⽅法和 copyOfRange() ⽅法Arrays 类的 copyOf() ⽅法与 copyOfRange() ⽅法都可实现对数组的复制。
copyOf() ⽅法是复制数组⾄指定长度,copyOfRange() ⽅法则将指定数组的指定长度复制到⼀个新数组中。
1. 使⽤ copyOf() ⽅法对数组进⾏复制Arrays 类的 copyOf() ⽅法的语法格式如下:Arrays.copyOf(dataType[] srcArray,int length);其中,srcArray 表⽰要进⾏复制的数组,length 表⽰复制后的新数组的长度。
使⽤这种⽅法复制数组时,默认从原数组的第⼀个元素(索引值为 0)开始复制,⽬标数组的长度将为 length。
如果 length ⼤于 srcArray.length,则⽬标数组中采⽤默认值填充;如果 length ⼩于 srcArray.length,则复制到第 length 个元素(索引值为 length-1)即⽌。
注意:⽬标数组如果已经存在,将会被重构。
例 1假设有⼀个数组中保存了 5 个成绩,现在需要在⼀个新数组中保存这 5 个成绩,同时留 3 个空余的元素供后期开发使⽤。
使⽤ Arrays 类的 CopyOf() ⽅法完成数组复制的代码如下:import java.util.Arrays;public class Test19{public static void main(String[] args) {// 定义长度为 5 的数组int scores[] = new int[]{57,81,68,75,91};// 输出原数组System.out.println("原数组内容如下:");// 循环遍历原数组for(int i=0;i<scores.length;i++) {// 将数组元素输出System.out.print(scores[i]+"\t");}// 定义⼀个新的数组,将 scores 数组中的 5 个元素复制过来// 同时留 3 个内存空间供以后开发使⽤int[] newScores = (int[])Arrays.copyOf(scores,8);System.out.println("\n复制的新数组内容如下:");// 循环遍历复制后的新数组for(int j=0;j<newScores.length;j++) {// 将新数组的元素输出System.out.print(newScores[j]+"\t");}}}在上述代码中,由于原数组 scores 的长度为 5,⽽要复制的新数组 newScores 的长度为 8,因此在将原数组中的 5 个元素复制完之后,会采⽤默认值填充剩余 3 个元素的内容。
java中复制对象的方法(原创版3篇)《java中复制对象的方法》篇1在Java 中,有两种常见的复制对象的方法:浅拷贝和深拷贝。
1. 浅拷贝浅拷贝是指复制对象时,只复制对象本身所占用的内存空间,而不会复制对象内部的引用类型。
如果对象内部包含引用类型,那么浅拷贝后的新对象和原对象共享同一个引用类型,当引用类型发生变化时,会影响到浅拷贝后的新对象。
Java 中,通过复制构造函数实现浅拷贝。
示例如下:```javapublic class Person {private String name;private int age;private Address address;public Person(String name, int age, Address address) { = name;this.age = age;this.address = address;}public static void main(String[] args) {Person original = new Person("Alice", 20, new Address("北京"));Person copy = new Person(original);System.out.println("Original address: " + original.address.getCity());System.out.println("Copy address: " + copy.address.getCity());original.address = new Address("上海");System.out.println("Updated original address: " +original.address.getCity());System.out.println("Copy address: " + copy.address.getCity());}}class Address {private String city;public Address(String city) {this.city = city;}public String getCity() {return this.city;}}```输出结果为:```Original address: 北京Copy address: 北京Updated original address: 上海Copy address: 北京```可以看出,浅拷贝后的新对象和原对象共享同一个地址引用,当原对象的地址发生变化时,浅拷贝后的新对象的地址也会随之变化。
java数组深拷贝_浅谈Java中实现深拷贝的两种方式—cloneSerialized在Java中,数组是一种常见的数据结构,它可以用来存储一组相同类型的元素。
当我们需要对数组进行拷贝操作时,有时候需要进行深拷贝,以实现复制数组的所有元素和内部对象。
本文将介绍Java中实现数组深拷贝的两种常用方式:使用clone(方法和使用序列化。
一、使用clone(方法实现数组深拷贝在Java中,所有的对象都继承自Object类,而Object类中提供了一个clone(方法,可以用于创建对象的副本。
数组也是对象的一种,所以数组也可以使用clone(方法进行拷贝。
1. 使用clone(方法实现数组的深拷贝,需要注意以下几点:- 数组必须实现Cloneable接口,否则会抛出CloneNotSupportedException异常;- clone(方法是protected类型的,只能在子类中使用,所以需要在数组的类中重写该方法,并将其设置为public类型;- 在clone(方法中,需要对数组中的每一个元素也进行拷贝,以实现深拷贝。
对于基本数据类型的数组元素,可以直接进行赋值;对于引用类型的数组元素,也需要使用clone(方法进行拷贝。
下面是一个使用clone(方法实现数组深拷贝的示例代码:```javapublic class DeepCopyArray implements Cloneableprivate int[] array;public DeepCopyArray(int[] array)this.array = array;}public DeepCopyArray clontry// 调用Object类的clone(方法创建对象的浅拷贝DeepCopyArray copy = (DeepCopyArray) super.clone(;//对引用类型的数组元素进行拷贝copy.array = array.clone(;return copy;} catch (CloneNotSupportedException e)e.printStackTrace(;return null;}}```2. 在使用clone(方法进行深拷贝时,需要注意的是,如果数组中的元素是对象,而不是基本数据类型,那么需要保证对象也实现了Cloneable接口,并重写clone(方法,并在clone(方法中对对象的成员变量进行拷贝,以实现对对象的深拷贝。
Java中对象拷贝的两种⽅式基本类型拷贝:克隆是针对于对象⽽⾔的,基本类型(boolean,char,byte,short,float,double.long)已久具备⾃⾝克隆的特性.int x=1;int y=x;System.out.println(x);//1System.out.println(y);//1y=2;System.out.println(x);//1System.out.println(y);//2JVM实现拷贝的⽬的:⼤家先思考⼀个问题,为什么需要克隆对象?直接 new ⼀个对象不⾏吗? 答案是:克隆的对象可能包含⼀些已经修改过的属性,⽽ new 出来的对象的属性都还是初始化时候的值,所以当需要⼀个新的对象来保存当前对象的 “状态” 就靠 clone ⽅法了。
那么我把这个对象的临时属性⼀个⼀个的赋值给我新 new 的对象不也⾏嘛?可以是可以,但是⼀来⿇烦不说,⼆来,⼤家通过上⾯的源码都发现了 clone 是⼀个 native ⽅法,就是快啊,在底层实现的引⽤的拷贝1 //引⽤拷贝2 private static void copyReferenceObject(){3 Person p = new Person(23, "zhang");4 Person p1 = p;5 System.out.println(p);6 System.out.println(p1);7 }这⾥打印的结果:Person@3654919ePerson@3654919e可以看到,打印的结果是⼀样的,也就是说,⼆者的引⽤是同⼀个对象,并没有创建出⼀个新的对象。
因此要区分引⽤拷贝和对象拷贝的区别,下⾯要介绍的就是对象拷贝。
浅拷贝如果pojo中存在的是基本数据类型,String 除外,实现Cloneable 覆写Clone ⽅法这个就是浅拷贝- code1 package core.java.deeporshoawcopy;23 /**4 * @author DGW-PC5 * @date 2018年6⽉7⽇6 * @see 验证浅拷贝⼀般要求实体类使⽤包装类型对于深拷贝类中存在对其他类的引⽤,也需要实现cloneable接⼝7 */89 class Person implements Cloneable{10 private String name;11 private Integer age;12 public String getName() {13 return name;14 }15 public void setName(String name) {16 = name;17 }18 public Integer getAge() {19 return age;20 }21 public void setAge(Integer age) {23 }24 @Override25 protected Object clone() throws CloneNotSupportedException {26 /*Person p=null;27 try{28 p=(Person) super.clone();29 }catch (CloneNotSupportedException e) {30 }*/31 return super.clone();32 }33 }3435 public class Base {3637 public static void main(String[] args) throws CloneNotSupportedException {38 Person person = new Person();39 person.setName("a");40 person.setAge(12);41 Person per1=(Person) person.clone();42 per1.setName("b");43 per1.setAge(14);;44 System.out.println(person.getName()+" "+person.getAge().hashCode(0));45 System.out.println(per1.getName()+" "+per1.getAge());46 }4748 }内存图:深拷贝- 如果你的POJO 存在的不是基本上数据类型,可以是⾃⼰定义类型,也可以其他包提供的类型这⾥以java 提供的Data 的为例⼦可以看下⾯的代码⾃⾝实现clone ⽅法你在涉及到使⽤拷贝的时候⼀定要注意别的包提供的类是否出现了问题1 /**2 * Return a copy of this object.3 */4 public Object clone() {6 try {7 d = (Date)super.clone();8 if (cdate != null) {9 d.cdate = (BaseCalendar.Date) cdate.clone();10 }11 } catch (CloneNotSupportedException e) {} // Won't happen12 return d;13 }- 下⾯介绍⼀下基本深拷贝的代码很短:你⼀定主要主类包装了多少其他的引⽤类型的其他类,那么其他必须都要实现Cloneable 接⼝以及clone (保护⽅法) ⽅法⽅法原型:仔细⼀看,它还是⼀个 native ⽅法,⼤家都知道 native ⽅法是⾮ Java 语⾔实现的代码,供 Java 程序调⽤的,因为 Java 程序是运⾏在 JVM 虚拟机上⾯的,要想访问到⽐较底层的与操作系统相关的就没办法了,只能由靠近操作系统的语⾔来实现1/*2Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object.3The general intent is that, for any object x, the expression:41) x.clone() != x will be true52) x.clone().getClass() == x.getClass() will be true, but these are not absolute requirements.63) x.clone().equals(x) will be true, this is not an absolute requirement.7*/8protected native Object clone() throws CloneNotSupportedException;需要满⾜的条件:对于任何对象x,表达式:1)x.clone()!= x将为真2)x.clone()。
java克隆入门和深入我们知道,Java是纯面向对象的程序设计语言。
Java里,所有的类的顶级父类都是ng.Object类,也就是说,如果一个类没有显示申明继承关系,它的父类默认就是ng.Object。
有一个很简单的方法可以证明这一点,我们写一个Test类,如下:public class Test {public void someMethod() {super.clone();}}里面调用了super.clone(),编译时并不报错。
其实clone()方法为ng.Object类提供的一个protected型方法。
对象克隆本文通过介绍ng.Object#clone()方法来说明Java语言的对象克隆特性。
ng.Object#clone()方法由ng.Object加以实现,主要对对象本身加以克隆。
首先我们看看下面的例子:public class TestClone {public static void main(String[] args) {MyClone myClone1 = new MyClone("clone1");MyClone myClone2 = (MyClone)myClone1.clone();if (myClone2 != null) {System.out.println(myClone2.getName());System.out.println("myClone2 equals myClone1: " + myClone2.equals(myClone1));} else {System.out.println("Clone Not Supported");}}}class MyClone {private String name;public MyClone(String name) { = name;}public String getName() {return name;}public void setName(String name) { = name;}public Object clone() {try {return super.clone();} catch (CloneNotSupportedException e) {return null;}}编译执行TestClone,打印出:C:\clone>javac *.javaC:\clone>java TestCloneClone Not SupportedC:\clone>说明MyClone#clone()方法调用super.clone()时抛出了CloneNotSupportedException异常,不支持克隆。
为什么父类ng.Object里提供了clone()方法,却不能调用呢?原来,Java语言虽然提供了这个方法,但考虑到安全问题,一方面将clone()访问级别设置为protected型,以限制外部类访问;另一方面,强制需要提供clone功能的子类实现ng.Cloneable接口,在运行期,JVM会检查调用clone()方法的类,如果该类未实现ng.Cloneable接口,则抛出CloneNotSupportedException异常。
ng.Cloneable接口是一个空的接口,没有申明任何属性与方法。
该接口只是告诉JVM,该接口的实现类需要开放“克隆”功能。
我们再将MyClone类稍作改变,让其实现Cloneable接口:class MyClone implements Cloneable {...//其余不做改变}编译执行TestClone,打印出:C:\clone>javac *.javaC:\clone>java TestCloneclone1myClone2 equals myClone1: falseC:\clone>根据结果,我们可以发现:1,myClone1.clone()克隆了跟myClone1具有相同属性值的对象2,但克隆出的对象myClone2跟myClone1不是同一个对象(具有不同的内存空间)小结:如果要让一个类A提供克隆功能,该类必须实现ng.Cloneable接口,并重载ng.Object#clone()方法。
public class A extends Cloneable {public Object clone() {try {return super.clone();} catch (CloneNotSupportedException e) {//throw (new InternalError(e.getMessage()));return null;}}}对象的深层次克隆上例说明了怎么样克隆一个具有简单属性(String,int,boolean等)的对象。
但如果一个对象的属性类型是List,Map,或者用户自定义的其他类时,克隆行为是通过怎样的方式进行的?很多时候,我们希望即使修改了克隆后的对象的属性值,也不会影响到原对象,这种克隆我们称之为对象的深层次克隆。
怎么样实现对象的深层次克隆呢?验证对象的克隆方式为了验证对象的克隆方式,我们对上面的例子加以改进,如下(为了节省篇幅,我们省略了setter与getter方法):public class TestClone {public static void main(String[] args) {//为克隆对象设置值MyClone myClone1 = new MyClone("clone1");myClone1.setBoolValue(true);myClone1.setIntValue(100);//设置List值List <Element>listValue = new ArrayList<Element>();listValue.add(new Element("ListElement1"));listValue.add(new Element("ListElement2"));listValue.add(new Element("ListElement3"));myClone1.setListValue(listValue);//设置Element值Element element1 = new Element("element1");myClone1.setElement(element1);//克隆MyClone myClone2 = (MyClone)myClone1.clone();if (myClone2 != null) {//简单属性System.out.println("=" + myClone2.getName()+ " myClone2.boolValue=" + myClone2.isBoolValue()+ " myClone2.intValue=" + myClone2.getIntValue() );//复合属性(List<Element>与Element)List clonedList = myClone2.getListValue();Element element2 = myClone2.getElement();System.out.println("myClone2.listValue.size():" + clonedList.size());System.out.println("myClone2.element.equals(myClone1.element):" + element2.equals(element1));System.out.println(":" + element2.getName());//下面我们测试一下myClone2.element是否等于myClone1.element//以及myClone2.listValue是否等于myClone1.listValue//为此,我们修改myClone2.element与myClone2.listValue,如果myClone1的相应值也跟着被修改了,则它们引用的是同一个内存空间的变量,我们认为它们相等clonedList.add("ListElement4");System.out.println("myClone1.listValue.size():" + listValue.size());element2.setName("Element2");System.out.println(":" + element1.getName());} else {System.out.println("Clone Not Supported");}}}class MyClone implements Cloneable {private int intValue;private boolean boolValue;private String name;private List <Element>listValue;private Element element;public MyClone(String name) { = name;}...//setter与getter方法(略)}class Element implements Cloneable {private String name;public Element (String name) { = name;}...//setter与getter方法(略)}编译执行TestClone,打印出:C:\clone>javac *.javaC:\clone>java TestClone=clone1 myClone2.boolValue=true myClone2.intValue=100myClone2.listValue.size():3myClone2.element.equals(myClone1.element):true:element1myClone1.listValue.size():4:Element2myClone2 equals myClone1: falseC:\clone>我们发现,对于对象里的List,Element等复合属性,super.clone()只是简单地赋值,没有采取克隆手段。