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()方法中执行相应的深拷贝操作。

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

相关推荐
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王6 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神7 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342737 小时前
Java实现离线身份证号码OCR识别
java·开发语言