博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础---->Java关于复制的使用(一)
阅读量:5107 次
发布时间:2019-06-13

本文共 2289 字,大约阅读时间需要 7 分钟。

  这里简单记录一下java中关于浅复制和深复制的知识。很多时候,一个人选择了行走,不是因为欲望,也并非诱惑,他仅仅是听到了自己内心的声音。

 

java中的复制clone方法

一、java对象的浅复制

  一个实现了Cloneable并重写了clone方法的类A,有一个无参构造或有参构造B,通过new关键字产生了一个对象S,再然后通过S.clone()方式产生了一个新的对象T,那么在对象拷贝时构造函数B是不会被执行的

public class Thing implements Cloneable {    //定义一个私有变量    private ArrayList
arrayList = new ArrayList
(); public Thing() { System.out.println("构造函数被执行了......"); } @Override protected Thing clone() { Thing thing = null; try { thing = (Thing) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return thing; } //设置HashMap的值 public void setValue(String value) { this.arrayList.add(value); } //取得arrayList的值 public List
getValue() { return this.arrayList; }}

  Thing类实现了Cloneable接口,并重写了Object的clone方法,里面有一个ArrayList列表的私有变量。现在我们的测试代码如下:

package com.linux.huhx.learn.clone;/** * @Author: huhx * @Date: 2017-12-26 上午 10:57 */public class ClientMain {    public static void main(String[] args) {        // 产生一个对象        Thing thing = new Thing();        thing.setValue("huhx");        // 复制一个对象        Thing cloneThing = thing.clone();        cloneThing.setValue("linux");        System.out.println(thing.getValue());    }}

运行的结果如下:

构造函数被执行了......[huhx, linux]

  从结果我们可以看到:thing.clone()执行并没有再次调用构造函数,复制后的对象和原对象共享私有变量arrayList,也就是说复制对象对arrayList的操作会映射到原对象的arrayList。这样的浅拷贝是有风险的,下面我们介绍一下怎样实现对象的深复制。我们只需要在Thing类中clone方法加上数组的复制代码就可以,clone方法的代码如下:

@Overrideprotected Thing clone() {    Thing thing = null;    try {        thing = (Thing) super.clone();        thing.arrayList = (ArrayList
) this.arrayList.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return thing;}

  现在再执行ClientMain的main方法,打印的结果如下:可以看到原对象的arrayList并没有改变。

构造函数被执行了......[huhx]

  需要注意的是:对象的clone与对象内的final关键字是有冲突的,我们修改Thing类的私有变量arrayList的修饰符。

private final ArrayList
arrayList = new ArrayList
();

  通过ide我们可以看到在thing.arrayList = (ArrayList<String>) this.arrayList.clone();代码处会有编译报错。所以要想实现对象的深复制,类的成员变量上不要增加final关键字。

Cannot assign a value to final variable 'arrayList'

 

友情链接

 

转载于:https://www.cnblogs.com/huhx/p/baseusejavaclone1.html

你可能感兴趣的文章
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
设计模式之装饰者模式
查看>>
一道不知道哪里来的容斥题
查看>>
Blender Python UV 学习
查看>>
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>