其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力,

就需要实现Cloneable接口,重写clone方法。通过克隆方法得到的对象是一个本地的副本。

1、实现Cloneable接口

具体看代码:

class User implements Cloneable{

  int age;

  public User(int age){

    //用this关键字不至于类成员变量与形参混淆

    this.age=age;

  }

  //这里可加@Override也可不加,加了会自动提示是否正确

  @Override

  public Object clone{

    Object o=null;

    try{

      o=super.clone();

    }catch(CloneNotSupportedException e){

      e.printStackTrace();

    }

  }

  public String toString(){

    return Integer.toString(this.age);

  }

}

2、自己手动写一个CloneUtil 工具类,不是实现Cloneable这种方式,但是能达到效果。

package cn.com.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 对象clone 工具类
 * @author
 *
 */
public class CloneUtil {
    public static Object clone(Serializable obj) {
        Object clone = cloneObject(obj);
        if (clone == null) {
            clone = cloneObject(obj);
        }
        return clone;
    }

public static Object cloneObject(Serializable obj) {
        Object anotherObj = null;

ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = null;

ObjectInputStream ois = null;
        try {
            oos = new ObjectOutputStream(baos);
            oos.writeObject(obj);
            byte[] bytes = baos.toByteArray();

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

ois = new ObjectInputStream(bais);
            anotherObj = ois.readObject();
        } catch (IOException ex) {
            throw new RuntimeException(ex.getMessage(), ex);
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException(ex.getMessage(), ex);
        } catch (StackOverflowError error) {
            System.out.println("stack length " + error.getStackTrace().length);
            error.printStackTrace();
            return null;
        } finally {
            if (oos != null)
                try {
                    oos.close();
                } catch (IOException localIOException3) {
                }
            if (ois != null)
                try {
                    ois.close();
                } catch (IOException localIOException4) {
                }
        }
        return anotherObj;
    }

public static int getObjectSize(Serializable obj) {
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        try {
            ObjectOutputStream os = new ObjectOutputStream(bs);
            os.writeObject(obj);
            os.flush();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
        return bs.size();
    }
}

java中定义一个CloneUtil 工具类相关推荐

  1. 39.在Java中定义一个不做事且没有参数的构造方法的作用?

    1 在Java中定义一个不做事且没有参数的构造方法的作用 Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会 调用父类中"没有参数的构造方法&quo ...

  2. java 整型数组定义_在Java中定义一个具有10个元素的整型数组a的语句是:___

    在Java中定义一个具有10个元素的整型数组a的语句是:___ 答: int [] arr = new int[10] 在借贷记账法下() 答:在账户结构上,"借"和"贷 ...

  3. java中常用的日期工具类

    java中常用的日期工具类 日期相关的类: package net.yto.ofclacct.core.util;import java.text.ParseException; import jav ...

  4. Java中操作字符串的工具类-判空、截取、格式化、转换驼峰、转集合和list、是否包含

    场景 某些常用的对字符串进行处理的方法抽离出来成工具类,方便在多处应用. 常用的操作为: 判断是否为空 截取字符串 格式化文本 字符串转set 字符串转list 下划线转驼峰命名 是否包含字符串 注: ...

  5. java 抽象属性_怎样在java中定义一个抽象属性

    [51CTO活动]8.26 带你深度了解清华大学.搜狗基于算法的IT运维实践与探索 Abstract关键字通常被用于类和方法,用来把某些行为的实现委托给子类.由于Java不支持抽象属性,如果你试图将类 ...

  6. java中定义一个时间_Java中的日期和时间

    根据个人目前正在编写的<Java核心编程-基础篇>的规划,这部分属于第15章内容,这里沿用了书中的章节编号.另外,因为原文篇幅太长,这里适当做了删减. 15.1.概述 在 Java 8 之 ...

  7. java des 加密工具的使用,Java中DES加密解密工具类的实现实例

    这篇文章主要介绍了Java实现的DES加密解密工具类,结合具体实例形式分析了Java实现的DES加密解密工具类定义与使用方法,需要的朋友可以参考下 本文实例讲述了Java实现的DES加密解密工具类.分 ...

  8. java中常用到的工具类使用

    Tool 不定期更新,建议收藏,收录日常所用 1,判断对象是否为空的常用工具类 2,对象和数组的复制 3,关于拼接字符串去掉最后一个符号的三种方式 4,判断对象值属性不为null并且不为空字符串 5, ...

  9. JWT|概述|JWT结构|JWT在java中的使用|JWT工具类的封装|JWT在springboot中的使用|JWT与拦截器的配合

    JWT ! 前记: 官网:https://jwt.io/ jwt有人说是用计算力换空间(相对于session) 小程序后台要求全部用springboot实现..登录状态的管理:本来想用自己随便生成UU ...

最新文章

  1. 架构实战项目心得(三):JAVA和MAVEN的环境配置
  2. hadoop3.2.0集群搭建的一些坑!
  3. aws创建html网页,AWS: 在AWS上创建一个网站,综合运用(Lambda + Api Gateway + Dynamodb + S3)...
  4. cocos2d-x游戏开发(八)各类构造器
  5. 允许使用抽象类类型 isearchboxinfo 的对象_Java学习5-设计模式+抽象类/方法
  6. python123io如何编辑_计算机二级python学习教程(1) 教大家如何学习python
  7. 重叠面积_20天津中考试卷及答案(24题重叠面积画板制作教程)
  8. LCA SP913 QTREE2 - Query on a tree II
  9. Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)
  10. Neutron Vlan Network 原理- 每天5分钟玩转 OpenStack(92)
  11. linux内核之dmaengine
  12. python与数据挖掘课后实验答案_数据仓库与数据挖掘课后习题答案
  13. 餐饮业实施5S管理的效益及实施方案
  14. 如何把控单元测试的粒度让你省时省力甚至一劳永逸建议一键收藏
  15. CAD关于文字样式删除文字样式操作(com接口c#语言)
  16. 批量转化文件夹下图片格式方法,简单易操作!
  17. 论文《Reasoning With Neural Tensor Networks for Knowledge Base Completion》的学习笔记
  18. ts获取服务器数据_ts 流服务器
  19. 消费者需求研究能够解决什么问题
  20. C++重温笔记(十二): C++多文件编程

热门文章

  1. leetcode116. 填充每个节点的下一个右侧节点指针
  2. C++:32---IO库
  3. Nginx 配置UDP负载均衡
  4. Python(10)- 格式化输出%
  5. 推荐算法--利用用户行为数据(02)
  6. 在wsl下运行c语言,在Windows10通过WSL架设linux/gcc c语言学习环境
  7. 使用百度大脑,导入aip以及相应的库文件报错问题
  8. Android Studio 安装ASM插件
  9. 要有自己的核心竞争力,应对时代变迁
  10. x264里的2pass指的是什么意思? x264源代码分析2.encode()