java中什么是深克隆和浅克隆?

在Java中,深克隆和浅克隆是涉及对象复制的两个概念。

  1. 浅克隆(Shallow Cloning):

    • 浅克隆创建一个新对象,该对象与原始对象具有相同的字段值。然而,对于对象内部的引用类型字段,浅克隆将复制引用而不是引用的内容。这意味着原始对象和克隆对象将共享相同的引用对象。
    • 在Java中,使用clone()方法来实现浅克隆。需要注意的是,被克隆的类要实现Cloneable接口,否则会抛出CloneNotSupportedException
    java 复制代码
    package javabasic;
    
    public class Style {
    
        private String color;
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    }
    java 复制代码
    package javabasic;
    
    public class Element implements Cloneable{
    
        private String name;
    
        private Style style; // 引用另一个对象
    
        public void init(String name, Style style){
            this.name = name;
            this.style = style;
        }
    
    	// 打印当前引用的style对象
        public void printStyle(){
            System.out.println(this.style);
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException{
            return super.clone();
        }
    }

    然后可以使用:

    java 复制代码
    package javabasic;
    
    public class Test {
    
        public static void main(String[] args) throws CloneNotSupportedException {
            Style style = new Style();
            style.setColor("#FF0000");
            
            Element original = new Element();
            original.init("rec",style);
            
            Element clone = (Element) original.clone();
            
            // 打印引用的对象style,可以看到是引用了同一个对象
            original.printStyle(); // javabasic.Style@4554617c
            clone.printStyle(); // javabasic.Style@4554617c
            
        }
    }
  2. 深克隆(Deep Cloning):

    • 深克隆创建一个新对象,并尽力复制原始对象及其所有嵌套的引用类型字段,以确保原始对象和克隆对象的内部对象不共享引用。
    • 实现深克隆可能涉及递归复制对象的内部引用。这可以通过手动实现clone()方法来实现,或者使用第三方库或序列化来处理。
    java 复制代码
    package javabasic;
    
    public class Style implements Cloneable{
    
        private String color;
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    java 复制代码
    package javabasic;
    
    public class Element implements Cloneable{
    
        private String name;
    
        private Style style; // 引用另一个对象
    
        public void init(String name, Style style){
            this.name = name;
            this.style = style;
        }
    
        // 打印当前引用的style对象
        public void printStyle(){
            System.out.println(this.style);
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException{
            Element clone = (Element)super.clone();
            // 对于引用类型字段,执行深拷贝
            clone.style = (Style) style.clone();
            return clone;
        }
    
    }
    java 复制代码
    package javabasic;
    
    public class Test {
    
        public static void main(String[] args) throws CloneNotSupportedException {
            Style style = new Style();
            style.setColor("#FF0000");
    
            Element original = new Element();
            original.init("rec",style);
    
            Element clone = (Element) original.clone();
    
            // 打印引用的对象style,可以看到是引用的是不同的对象
            original.printStyle(); // javabasic.Style@4554617c
            clone.printStyle(); // javabasic.Style@74a14482
    
        }
    }

    在这个例子中,Style 类也需要实现Cloneable接口,并在其clone()方法中执行相应的深拷贝操作。

请注意,手动实现深克隆可能会变得复杂,特别是当对象包含多层嵌套引用时。在某些情况下,使用序列化和反序列化,或者使用第三方库,可能是更简单和可靠的选择。

相关推荐
ylfhpy1 小时前
Java面试黄金宝典30
java·数据库·算法·面试·职场和发展
喻米粒06222 小时前
RabbitMQ消息相关
java·jvm·spring boot·spring·spring cloud·sentinel·java-rabbitmq
Aphelios3804 小时前
Java全栈面试宝典:线程机制与Spring IOC容器深度解析
java·开发语言·jvm·学习·rbac
qq_529835354 小时前
装饰器模式:如何用Java打扮一个对象?
java·开发语言·装饰器模式
日暮南城故里5 小时前
Java学习------源码解析之StringBuilder
java·开发语言·学习·源码
一个public的class7 小时前
什么是 Java 泛型
java·开发语言·后端
士别三日&&当刮目相看7 小时前
JAVA学习*Object类
java·开发语言·学习
快来卷java7 小时前
MySQL篇(一):慢查询定位及索引、B树相关知识详解
java·数据结构·b树·mysql·adb
凸头8 小时前
I/O多路复用 + Reactor和Proactor + 一致性哈希
java·哈希算法
慵懒学者8 小时前
15 网络编程:三要素(IP地址、端口、协议)、UDP通信实现和TCP通信实现 (黑马Java视频笔记)
java·网络·笔记·tcp/ip·udp