Java - clone 方法属于浅拷贝 OR 深拷贝?

简介: Java - clone 方法属于浅拷贝 OR 深拷贝?

clone 方法是浅拷贝

1、Java 的 Object 类有 clone 方法,子类调用必须实现 Cloneable 接口

protected native Object clone() throws CloneNotSupportedException;

2、clone 方法默认是浅拷贝的,即返回一个新的对象,但是新对象里的引用类型变量地址指向的还是原对象内引用类型地址


3、可以实现不完全的深拷贝,即原对象内所有引用类型变量都实现 Cloneable 接口。原对象重写clone 方法时,这些引用类型变量也调一次 clone 方法。


4、彻底深拷贝,几乎是不可能实现的。因为对象里的引用类型变量经常出现层层调用关系。


5、深拷贝巧用:Fastjson、Kryo(推荐)


Fastjson



/**
 * Fastjson 工具类
 */
public static class FastjsonUtil {
    /**
     * 克隆(深拷贝)
     * @param source
     */
    public static <T> T clone(T source) {
        String jsonString = JSON.toJSONString(source);
        return (T) JSON.parseObject(jsonString, source.getClass());
    }
}
  • Kryo
/**
 * Kryo 工具类
 */
public static class KryoUtil {
    /**
     * Kryo ThreadLocal
     */
    private static final ThreadLocal<Kryo> KRYO_THREAD_LOCAL = new ThreadLocal<>();
    /**
     * 克隆(深拷贝)
     * @param source
     */
    public static <T> T clone(T source) {
        try {
            Kryo kryo = KRYO_THREAD_LOCAL.get();
            if (null == kryo) {
                kryo = new Kryo();
                kryo.setRegistrationRequired(false);
                KRYO_THREAD_LOCAL.set(kryo);
            }
            T target = kryo.copy(source);
            return target;
        } finally {
            KRYO_THREAD_LOCAL.remove();
        }
    }
}
目录
相关文章
|
14天前
|
Java
判断不为空和不为空串的方法java
判断不为空和不为空串的方法java
|
17天前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
1天前
|
Java 编译器 ice
【Java开发指南 | 第十九篇】Java方法
【Java开发指南 | 第十九篇】Java方法
6 0
|
1天前
|
Java 编译器 ice
【Java开发指南 | 第十七篇】Java 方法
【Java开发指南 | 第十七篇】Java 方法
6 1
|
1天前
|
Java ice
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
10 4
|
4天前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
15 1
|
5天前
|
存储 Java API
掌握8条方法设计规则,设计优雅健壮的Java方法
掌握8条方法设计规则,设计优雅健壮的Java方法
|
5天前
|
Java C语言
详解java方法与递归
详解java方法与递归
10 3
|
5天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
10 0
|
6天前
|
Java
Java一分钟之-方法定义与调用基础
【5月更文挑战第8天】本文介绍了Java编程中的方法定义和调用,包括基本结构、常见问题和避免策略。方法定义涉及返回类型、参数列表和方法体,易错点有返回类型不匹配、参数错误和忘记返回值。在方法调用时,要注意参数传递、静态与非静态方法的区分,以及重载方法的调用。避免错误的策略包括明确返回类型、参数校验、理解值传递、区分静态和非静态方法以及合理利用重载。通过学习和实践,可以提升编写清晰、可维护代码的能力。
13 0