java 克隆 clone

原创 2017年01月03日 17:24:34

一、介绍

java中没有指针概念,所以存在对象的引用问题。如果对象作为参数传递或者直接使用=其实都是对对象的引用。也就是你修改第二个对象的同时第一个对象的内容也改变了。二者地址相同。所以java中需要通过继承Cloneable接口实现对象的克隆。

二、浅Clone

浅克隆又称影子克隆。一般情况下适用于java基本数据类型和string类型。对于复杂类型无法满足要求。

package test;

public class CloneTest implements Cloneable {
    public String name;

    public Object clone() {
        Object clone = null;
        try{
            clone = super.clone();
        } catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return clone;
    }

    public static void main(String[] args){
        CloneTest test = new CloneTest();
        CloneTest copyTest = new CloneTest();
        test.name = "AAAA";
        copyTest = (CloneTest)test.clone();
        copyTest.name = "BBBB";
        System.out.println(test.name);
        System.out.println(copyTest.name);
    }
}

三、深Clone

对于复杂成员,vector、数组之类的需要采用深层克隆。

package test;

public class CloneTest implements Cloneable {
    public String[] name = new String[2];

    public Object clone() {
        CloneTest clone = null;  //注意申明的对象,后面调用clone.name需要类中有此类型
        try{
            clone = (CloneTest)super.clone();
            clone.name = (String[])name.clone();
        } catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return clone;
    }

    public static void main(String[] args){
        CloneTest test = new CloneTest();
        CloneTest copyTest = new CloneTest();
        test.name[0] = "AAAA";
        test.name[1] = "AA11";
        copyTest = (CloneTest)test.clone();
        copyTest.name[0] = "BBBB";
        copyTest.name[1] = "BB11";
        System.out.println(test.name[0]);
        System.out.println(copyTest.name[0]);
    }
}

java克隆对象clone()的用法和作用

内容摘要若需修改一个对象,同时不想改变调用者的对象,就要制作该对象的一个本地副本。这也是本地副本最常见的一种用途。若决定制作一个本地副本,只需简单地使用clone()方法即可。Clone是“克隆”的意...
  • u012975705
  • u012975705
  • 2015年12月09日 10:02
  • 11971

Java中Object类的clone()(克隆)方法

Java提供了一个projected修饰的clone()方法,该方法用来实现对象的“自我克隆”,即得到当前对象的一个副本,并且两个对象之间完全隔离。需要注意的是,由于该方法使用projected修饰,...
  • yuxxz
  • yuxxz
  • 2015年02月11日 23:04
  • 2672

java之克隆一个对象(此对象包含list引用)-clone()

在java克隆的时候,所要克隆的对象包含比较复杂的数据结构如:list集合等一些复杂的引用的时候,该怎么克隆。 深克隆,浅克隆的实现和理解。...
  • qq_27093465
  • qq_27093465
  • 2015年11月09日 16:09
  • 5814

java设计模式学习笔记--原型模式(浅克隆和深克隆)

1. 什么是原型模式原型模式属于对象的创建模式。。原型模式允许你通过复制现有的实例来创建新的实例。 这个模式的重点在于,客户端的代码在不知道要实例化何种特定类的情况下,可以制造出新的实例。在java...
  • yaoliao_11
  • yaoliao_11
  • 2016年11月28日 22:55
  • 420

Java 对象克隆(clone)

基本数据类型(boolean,char,byte,short,float,double,long)的复制很简单,比如:int width = 5; int height = width;基本数据类型进...
  • owenchan1987
  • owenchan1987
  • 2017年08月22日 10:12
  • 187

java的clone() 深克隆与浅克隆的区别

克隆的目的:快速创建一个已有对象的副本。 克隆的步骤: 创建一个对象将原有对象的数据导入到新创建的数据中 1. Object的clone()源代码简介 ...
  • u012129558
  • u012129558
  • 2016年05月16日 16:36
  • 1575

利用java序列化进行对象深Clone

在java语言里深复制一个对象,通常可以使对象实现Serializable接口,然后把对象(实际上是对象的一个copy),写到一个流里面,便可重复建立对象。 这样做被复制的对象与被复制对象里面的...
  • z69183787
  • z69183787
  • 2014年08月14日 20:17
  • 1419

JAVA 复制对象时为什么要用克隆clone()而不用“=”的原因

今天一直很纠结为什么java里面有个clone()方法,复制对象时直接“=”不就行了,为什么还要在每个类里面重写clone方法。     Google了下,发现这个是典型的先学C/C++后再学JAVA...
  • txg703003659
  • txg703003659
  • 2011年07月21日 15:13
  • 2776

java常用类库续2(大数操作BigInteger、BigDecimal类、对象克隆技术、Arrays类)

大数操作(BigInteger、BigDecimal) 大数操作:正常情况下一个整数最多只能放在long类型之中,但是现在如果有以下一个数字:1111111111111111111111111111...
  • cz1029648683
  • cz1029648683
  • 2011年08月07日 14:27
  • 1807

Java 克隆Clone 和 Apache BeanUtils

package com.java.test.clone; /** * @author Spark * @since 2010-02-10 * */ public class UserA...
  • wind_324
  • wind_324
  • 2011年02月10日 16:03
  • 4843
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 克隆 clone
举报原因:
原因补充:

(最多只允许输入30个字)