- 浏览: 304832 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
a785975139:
我的还是没用
解决maven与eclipse中@override出现must override a superclass method错误 -
yangpeihai:
也可以修改maven依赖的jdk版本,请参考:http://l ...
解决maven与eclipse中@override出现must override a superclass method错误 -
yangpeihai:
还有一种办法,不用修改plugin:window->pr ...
解决maven与eclipse中@override出现must override a superclass method错误 -
ctwen:
...
Character.UnicodeBlock中cjk的说明 -
得小白者天下得:
你好,我按照你的设置弄过以后还是报出同样的错。以下是出错信息j ...
eclipse安装hadoop插件的问题
编码过程中需要用到clone方法,以前看过不少,长时间不用记得不是很清楚,于是google了一下发现好多都说的比较乱,于是重新查了下资料做个记录。
首先是java6 api中Cloneable接口的描述
主要部分是第一段,意思是:实现了Cloneable接口的类可以合法的使用clone方法来创建一个该类的属性对属性复制的对象。我的理解是clone方法返回一个新对象,该对象的属性值是对原对象属性值的简单复制。
下面是java6 api中对Obejct对象clone方法的注释
大概的主要意思是
1.x.clone() != x,意思是clone方法返回的对象是新生成的对象与原来对象的地址不相等。
2. x.clone().getClass() == x.getClass(),两个对象的类是相同的。
3. x.clone().equals(x),这点需要着重说明:这个不是clone方法的绝对要求,这个主要看equals方法的实现。
4.按照惯例每个实现Cloneable接口的类的clone()方法的对象需要由super.clone()来生成,这样可以保证该类的父类(除了Object类)都满足条件2.
5.在返回由super.clone()生成的对象前需要根据需求适当的修改生成对象的属性,这就涉及到深拷贝和浅拷贝。因为Object的clone()方法只是对简单的属性值复制,所以如果对象中有可变的数据结构(类似数组,链表,对象等引用类型)需要进行深拷贝。而如果只是基本类型,或者不可变的对象(如String对象)则只需要浅拷贝。
另外需要注意的是Object.clone()方法是protect类型的,我们在覆盖的时候需要修改为public类型。
下面这段代码是具体类cloe()方法浅拷贝一般写法
这是深拷贝的一般写法
下面贴出测试clone方法的测试代码
首先是java6 api中Cloneable接口的描述
A class implements the Cloneable interface to indicate to the Object.clone() method that it is legal for that method to make a field-for-field copy of instances of that class. Invoking Object's clone method on an instance that does not implement the Cloneable interface results in the exception CloneNotSupportedException being thrown. By convention, classes that implement this interface should override Object.clone (which is protected) with a public method. See Object.clone() for details on overriding this method. Note that this interface does not contain the clone method. Therefore, it is not possible to clone an object merely by virtue of the fact that it implements this interface. Even if the clone method is invoked reflectively, there is no guarantee that it will succeed.
主要部分是第一段,意思是:实现了Cloneable接口的类可以合法的使用clone方法来创建一个该类的属性对属性复制的对象。我的理解是clone方法返回一个新对象,该对象的属性值是对原对象属性值的简单复制。
下面是java6 api中对Obejct对象clone方法的注释
Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object. The general intent is that, for any object x, the expression: x.clone() != x will be true, and that the expression: x.clone().getClass() == x.getClass() will be true, but these are not absolute requirements. While it is typically the case that: x.clone().equals(x) will be true, this is not an absolute requirement. By convention, the returned object should be obtained by calling super.clone. If a class and all of its superclasses (except Object) obey this convention, it will be the case that x.clone().getClass() == x.getClass(). By convention, the object returned by this method should be independent of this object (which is being cloned). To achieve this independence, it may be necessary to modify one or more fields of the object returned by super.clone before returning it. Typically, this means copying any mutable objects that comprise the internal "deep structure" of the object being cloned and replacing the references to these objects with references to the copies. If a class contains only primitive fields or references to immutable objects, then it is usually the case that no fields in the object returned by super.clone need to be modified. The method clone for class Object performs a specific cloning operation. First, if the class of this object does not implement the interface Cloneable, then a CloneNotSupportedException is thrown. Note that all arrays are considered to implement the interface Cloneable. Otherwise, this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation. The class Object does not itself implement the interface Cloneable, so calling the clone method on an object whose class is Object will result in throwing an exception at run time.
大概的主要意思是
1.x.clone() != x,意思是clone方法返回的对象是新生成的对象与原来对象的地址不相等。
2. x.clone().getClass() == x.getClass(),两个对象的类是相同的。
3. x.clone().equals(x),这点需要着重说明:这个不是clone方法的绝对要求,这个主要看equals方法的实现。
4.按照惯例每个实现Cloneable接口的类的clone()方法的对象需要由super.clone()来生成,这样可以保证该类的父类(除了Object类)都满足条件2.
5.在返回由super.clone()生成的对象前需要根据需求适当的修改生成对象的属性,这就涉及到深拷贝和浅拷贝。因为Object的clone()方法只是对简单的属性值复制,所以如果对象中有可变的数据结构(类似数组,链表,对象等引用类型)需要进行深拷贝。而如果只是基本类型,或者不可变的对象(如String对象)则只需要浅拷贝。
另外需要注意的是Object.clone()方法是protect类型的,我们在覆盖的时候需要修改为public类型。
下面这段代码是具体类cloe()方法浅拷贝一般写法
abstract public class X implements Cloneable { public X clone() throws CloneNotSupportedException { return (X) super.clone(); } }
这是深拷贝的一般写法
public Z clone() throws CloneNotSupportedException { Z newZ = (Z) super.clone(); newZ.someABC = someABC.clone(); return newZ;
下面贴出测试clone方法的测试代码
import java.util.Arrays; /** * * @author lwj.charles * */ public class CloneTest { /** * 测试类A */ class A implements Cloneable{ private int num; //不可变属性,int类型 private String str;//不可变属性,String对象是不可修改的。 public A(int num, String str){ this.num = num; this.str = str; } public A clone() throws CloneNotSupportedException{ return (A)super.clone(); } public void display(){ System.out.println("-----begin-----"); System.out.println("int:" + num); System.out.println("String:" + str); System.out.println("-----end-----"); } } /** * 测试类B */ class B implements Cloneable{ private int num; //不可变属性 private int [] nums;//可变属性 public B(int num, int[] nums){ this.num = num; this.nums = nums; } // /** // * clone()方法的浅拷贝实现 // */ // public B clone() throws CloneNotSupportedException{ // return (B)super.clone(); // } /** * clone()方法的深拷贝实现 */ public B clone() throws CloneNotSupportedException{ B b = (B)super.clone(); b.nums = Arrays.copyOf(b.nums, b.nums.length); return b; } public void display(){ System.out.println("-----begin-----"); System.out.println("int:" + num); System.out.println("Arrays:" + nums); System.out.println("nums[1]:" + nums[1]); System.out.println("-----end-----"); } } public static void main(String [] args) throws CloneNotSupportedException{ CloneTest ct = new CloneTest(); //测试对象的属性为不可变属性。用浅拷贝即可满足要求。 CloneTest.A a1 = ct.new A(1,"test1"); CloneTest.A a2 = a1.clone(); a2.num = 2; a2.str = "test2"; a1.display(); a2.display(); //测试对象的属性为可变属性。注意对比试用浅拷贝和深拷贝的结果。 int [] nums = {1,2,3}; CloneTest.B b1 = ct.new B(1,nums); CloneTest.B b2 = b1.clone(); b2.num = 2; b2.nums[1] = -2; b1.display(); b2.display(); } }
发表评论
-
matlab常用函数
2012-05-30 15:11 2240eye 单位矩阵 zeros 全零 ... -
matlab使用笔记
2012-05-21 19:15 1972最近开始使用matlab编程,在这里记录下使用过程中需要注意的 ... -
tomcat内存优化设置
2012-05-17 21:37 1522服务器运行一段时间就会崩溃,查看日志发现崩溃前抛出的是内存不够 ... -
Error: could not open `C:\Program Files\Java\jre6\lib\i386\jvm.cfg')
2012-05-08 13:53 9657前些日子装了个jdk7试了试,后来做项目需要换成jdk6,安装 ... -
将阿拉伯数字转化为中文数字
2012-04-13 14:17 1899今天在网上看到一个笔试题挺有意思,就是将阿拉伯数字转化为中文, ... -
mysql数据库选项设置(解决repair with keycache问题 )
2012-04-10 21:09 2707今天向mysql导入一个数据库备份文件,运行一段时间后发现停在 ... -
mysql数据库备份还原策略
2012-03-27 19:40 2744前几天网站数据库因为 ... -
在JVM 5.0中调配Garbage Collection(Tuning Garbage Collection with the 5.0 Java[tm] V)
2012-03-08 15:52 1385对于java虚拟机的gc回收问题一直比较迷惑,网上查了不少,说 ... -
Hadoop linux(ubuntu)分布式部署配置问题记录
2012-03-07 15:46 6706从昨天晚上开始陆陆续 ... -
ubuntu(linux)下ultraedit反复试用的方法
2012-03-05 14:58 2945UE 在处理文档方面能力强,但是从网上下载的只是试用版30天, ... -
eclipse安装hadoop插件的问题
2012-02-23 21:38 11367Hadoop版本:Hadoop-0.20.203. ... -
使用 useradd 新增使用者後 tab補全功能失效(變成空格),且沒有顏色
2012-02-22 20:35 1581用 #>usermod -s /bin/bash 使用者 ... -
linux(ubuntu)vim剪贴板和系统剪贴板交互
2012-02-17 10:13 3147在调试的过程中遇到将vim打开的日志文件中的数据拷贝出来,因为 ... -
文本处理中unicode字符65279(ZERO WIDTH NO-BREAK SPACE)遇到的问题
2011-12-21 10:16 8038代码中有一 ... -
Eclipse导入已存在的maven项目
2011-12-06 15:10 9364转自:http://celestialwolf.iteye.c ... -
筛选法求素数Java代码和matlab代码实现
2011-12-02 10:08 4160关于筛选法求素数的算法我就不介绍了,大家可以点这里查看相关资料 ... -
大量数据导入数据库问题总结(成也索引,败也索引)
2011-11-23 21:35 4015老板项目需要从类似日志的文本文件中提取出元数据,然后放到数据库 ... -
java中缀表达式转后缀表达式
2011-11-07 10:55 1619算法思想数据结构的书上都有,网上也能搜到,只是贴一个示例代码 ... -
解决maven与eclipse中@override出现must override a superclass method错误
2011-08-26 10:25 19318前几天看了下关于maven的介绍,决定试用一下,在使用过程中发 ... -
软件版本简写说明(GA,RC,Lite,Beta……)
2011-07-25 11:25 4033软件版本Beta,RC,Demo,Build,GA等是什么意思 ...
相关推荐
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...
### Java中的`clone`方法详解:浅拷贝与深拷贝 #### 一、引言 在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文...
本文将深入探讨Java中的`clone`方法,包括其工作原理、使用场景、注意事项以及一些个人实践心得。 首先,让我们理解什么是`clone`。在Java中,`clone`方法主要用于创建一个现有对象的副本,这个副本与原始对象具有...
本资料"Java中clone方法共6页.pdf.zip"可能包含了关于如何理解和使用`clone()`方法的详细解释,以及它在实际开发中的应用示例。 `clone()`方法的主要用途是创建一个现有对象的副本,这个副本与原始对象具有相同的...
理解并正确使用`clone`方法是Java编程中的一个重要概念,尤其是在处理复杂对象图和需要创建对象副本的场景中。不过,`clone`方法有时可能会带来一些复杂性,例如需要处理`CloneNotSupportedException`,以及处理深...
在Java编程语言中,`Cloneable`接口和`clone()`方法是两个重要的概念,它们用于对象复制。在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让...
理解对象复制和引用传递的概念对于避免意外的数据修改至关重要,而正确地使用`clone()`方法可以有效地实现这一目标。在实际开发中,我们还需要考虑深复制和浅复制的区别,以及如何根据需求定制`clone()`方法以满足...
在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...
本文将深入探讨Java中的`clone`方法及其相关知识点。 首先,`clone`方法是Java `Object`类的一个成员方法,定义为`protected Object clone() throws CloneNotSupportedException`。这意味着所有Java类都隐式地继承...
Java中的对象克隆可以通过实现`Cloneable`接口并覆盖`clone()`方法来完成。对象的克隆分为浅拷贝和深拷贝两种形式。 **1. 浅拷贝** 浅拷贝是指创建一个新的对象,然后将原对象的所有非引用类型的成员变量复制到新...
因此,理解和处理Java代码克隆是软件开发中的一个重要话题。 首先,我们需要理解代码克隆的类型。根据克隆的相似程度,可以分为四种主要类型: 1. **精确克隆(Exact Clone)**:两个代码片段完全相同,包括空格和...
Java中的对象创建主要有两种方式,即使用`new`操作符创建新对象以及通过`clone`方法复制已有对象。本文将从JVM的角度深入探讨Java的`clone`操作,揭示其工作原理及其潜在的问题。 首先,让我们理解`clone`方法的...
Java中的克隆(Clone)机制是面向对象编程中一种创建对象副本的方法,它允许程序员创建一个已有对象的新实例,新实例的数据与原对象相同。在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深度克隆(Deep ...
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在处理对象复制和克隆时。这个方法源自`Object`类,是所有Java类的基类。`clone()`的使用通常涉及到深度复制和浅复制的概念,这两者在数据结构和内存...
Java中的`clone()`方法是Object类的一个成员方法,它提供了创建一个对象副本的功能。这篇文章将深入探讨`clone()`方法的工作原理、使用场景以及浅拷贝(shallow clone)与深拷贝(deep clone)的区别。 首先,让...
方法是Java中实现功能的独立代码块,可以理解为函数。方法的定义包括返回类型、名称、参数列表和主体: ```java public 返回类型 方法名(参数类型 参数名1, 参数类型 参数名2) { // 方法体 } ``` 方法的调用则是...
在Java编程语言中,掌握常用的方法对于提升编程效率和代码质量至...这些方法的理解和熟练运用,将帮助开发者更好地编写高效、稳定的Java程序。通过学习和实践,你可以不断提升自己的编程技能,解决各种复杂的编程问题。
总的来说,`clone()`方法是Java中一种快速创建对象副本的手段,但它需要开发者对浅拷贝和深拷贝有清晰的理解,并根据实际需求适当地处理对象的属性。通过`nervouse78`的示例,你可以学习到如何在实际项目中运用`...