`
lizhuang
  • 浏览: 899843 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 如何复制对象

 
阅读更多
为什么需要克隆:
在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的,要满足这种需求有很多途径。

克隆的实现方式
一、浅度克隆
对于要克隆的对象,对于其基本数据类型的属性,复制一份给新产生的对象,对于非基本数据类型的属性,仅仅复制一份引用给新产生的对象,即新产生的对象和原始对象中的非基本数据类型的属性都指向的是同一个对象
1、实现java.lang.Cloneable接口
要clone的类为什么还要实现Cloneable接口呢?Cloneable接口是一个标识接口,不包含任何方法的!这个标识仅仅是针对Object类中clone()方法的,如果clone类没有实现Cloneable接口,并调用了Object的 clone()方法(也就是调用了super.Clone()方法),那么Object的clone()方法就会抛出 CloneNotSupportedException异常。

2、重载java.lang.Object.clone()方法
JDK API的说明文档解释这个方法将返回Object对象的一个拷贝。要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。

观察一下Object类的clone()方法是一个native方法,native方法的效率一般来说都是远高于java中的非native方法。这也解释了为什么要用Object中clone()方法而不是先new一个类,然后把原始对象中的信息赋到新对象中,虽然这也实现了clone功能。Object类中的clone()还是一个protected属性的方法,重载之后要把clone()方法的属性设置为public。

Object类中clone()方法产生的效果是:先在内存中开辟一块和原始对象一样的空间,然后原样拷贝原始对象中的内容。对基本数据类型,这样的操作是没有问题的,但对非基本类型变量,我们知道它们保存的仅仅是对象的引用,这也导致clone后的非基本类型变量和原始对象中相应的变量指向的是同一个对象。
分享到:
评论

相关推荐

    java 对象克隆

    总结,Java中的对象克隆是一项重要的功能,用于复制和独立化对象。通过实现`Cloneable`接口和覆盖`clone()`方法,我们可以创建浅克隆对象。对于更复杂的场景,可以自定义克隆逻辑或利用序列化来实现深克隆。理解并...

    java不同对象之间及集合的复制

    在Java编程中,对象之间的复制是一项常见的操作,特别是在数据传输、模型转换或者持久化存储等场景下。这里的“java不同对象之间及集合的复制”主要关注如何高效且便捷地完成对象及其集合的复制工作,避免繁琐的手动...

    java不同对象及集合的多次复制

    - **浅拷贝**:创建一个新的对象,只复制对象的引用,不复制内部引用的对象。这意味着改变其中一个对象的内部引用对象,会影响另一个对象。 - **深拷贝**:创建一个全新的对象,不仅复制对象本身,还递归复制其...

    java对象复制克隆

    **浅拷贝**:在浅拷贝中,新创建的对象与原对象共享同一块内存空间,只复制对象的引用,不复制对象的内容。因此,如果对象包含对其他对象的引用,修改复制对象的这些引用会影响到原始对象。 **深拷贝**:与浅拷贝...

    JAVA_对象克隆

    这个过程在需要复制对象的所有属性而不创建新类型实例时非常有用。本文将深入探讨Java中的对象克隆,包括其原理、实现方式以及注意事项。 一、对象克隆的原理 在Java中,对象克隆可以通过实现`Cloneable`接口并覆盖...

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    深拷贝不仅复制对象,还复制对象中引用的对象。在描述中提到的方法,很可能是关于深拷贝的实现。 在Java中,我们可以通过以下几种方法实现对象的深拷贝: 1. **实现Serializable接口**:利用序列化和反序列化来...

    Java对象的复制克隆

    Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...

    MongoDB、Java与对象关系映射

    ### MongoDB、Java与对象关系映射 #### MongoDB简介与特性 MongoDB作为一种强大的NoSQL数据库,在处理非结构化数据方面有着显著的优势。它通过使用JSON(JavaScript Object Notation)格式来存储和检索数据,简化...

    java类复制一个持久化对象

    在Java编程语言中,对象复制是一项常见的操作,尤其是在处理持久化对象时,为了保持数据的一致性和完整性,正确地复制对象变得尤为重要。本文将深入探讨如何利用反射机制在Java中复制一个持久化对象,理解其背后的...

    Java copy对象的工具类

    Java CopyUtil工具类,可以进行对象的深copy,比如:对象里面包含对象,对象里面包含Map,List,Set...等复杂类型的属性都可以copy,copy后的对象与原有对象没有联系,即改变原有对象内容,不会改变copy后的对象里面的...

    java中对象和对象引用的区别!

    这一点在Java中非常重要,因为它影响到了如何处理对象的复制以及对象的生命周期等问题。 - **空引用** 如果我们声明了一个引用变量但并未给它分配任何对象,那么这个引用变量就称为“空引用”或“未初始化的引用...

    java对象复制.pdf

    Java提供了多种复制对象的方式,其中最常见的就是通过`clone()`方法。 `clone()`方法是Java `Object`类中的一个`native`方法,它能够创建当前对象的一个副本。但是,直接调用`clone()`可能会抛出`...

    Java编程实现对象克隆(复制)代码详解

    对象克隆可以分为浅克隆和深克隆,浅克隆仅复制对象的引用,而深克隆则复制对象的所有属性。 对象克隆的原因是为了在不同的场景下使用同一个对象,而不影响原始对象的状态。例如,在游戏开发中,需要创建多个相同的...

    编程语言java对象复制.pdf

    浅复制仅仅复制对象中的基本类型数据和引用其他对象的引用,而不会复制引用的对象本身;而深复制则会复制对象本身以及所引用的所有对象,从而创建一个完全独立的对象副本。 知识点二:Cloneable接口的作用 在Java中...

    浅谈java面向对象和引用

    值类型的赋值操作会复制一个副本,而引用类型的赋值只是复制了指向同一对象的引用。 #### 示例解析 以文章中的例子为例: ```java Person person1 = new Person(""); Person person2 = person1; ``` 在这段代码...

    Java面向对象程序设计模拟试题

    根据给定的文件信息,我们可以总结出以下关于Java面向对象程序设计的重要知识点: ### Java面向对象基础 #### 1. 对象的创建与释放 - **创建对象**: 在Java中,使用`new`关键字来创建一个新的对象实例。例如,创建...

    java List 深度复制方法

    浅复制只复制对象本身,而不复制它引用的对象,而深复制则会递归复制所有引用的对象。这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来理解一下什么是浅复制和深复制。在Java中,当我们使用`clone()`...

    java 复制图片到剪切板

    在Java编程中,将图片复制到剪贴板是一项常见的任务,尤其在开发图形用户界面(GUI)应用时。本文将详细讲解如何实现这个功能,并结合给出的“qrcode_swing”这一标签,我们可以推断这是一个关于Swing组件库中处理...

    java对象复制[参考].pdf

    然而,`clone()`方法仅执行浅复制,即复制对象的引用属性,而不是引用指向的实体。如果对象的属性包含其他对象,这些内部对象并不会被复制,而是共享相同的引用。如果需要复制这些内部对象,就需要实现深复制,这...

Global site tag (gtag.js) - Google Analytics