首页 > 编程语言 >Java基础-浅拷贝和深拷贝

Java基础-浅拷贝和深拷贝

时间:2023-02-02 14:59:01浏览次数:46  
标签:Java name clone 基础 Inner Outer 拷贝 public inner

浅拷贝

浅拷贝会在堆上创建一个新的对象,如果原对象的属性是一个引用类型,拷贝的内部对象是原对象内部对象的引用地址,即原对象和拷贝对象用的是同一个内部对象。

class Inner implements Cloneable{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Inner(String name) {
        this.name = name;
    }

    @Override
    protected Inner clone() throws CloneNotSupportedException {
        return (Inner) super.clone();
    }
}

class Outer implements Cloneable{
    private Inner inner;

    public Inner getInner() {
        return inner;
    }

    public void setInner(Inner inner) {
        this.inner = inner;
    }

    public Outer(Inner inner) {
        this.inner = inner;
    }

    @Override
    protected Outer clone() throws CloneNotSupportedException {
        Outer outer = (Outer) super.clone();
        return outer;
    }
}

@Test
public void testCopy() throws CloneNotSupportedException {
    Outer outer = new Outer(new Inner("inner"));
    Outer clone = outer.clone();
    System.out.println(outer.getInner() == clone.getInner());
    // 输出:true
}

深拷贝

深拷贝会完全复制整个对象,包括原对象的内部对象。

class Inner implements Cloneable{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Inner(String name) {
        this.name = name;
    }

    @Override
    protected Inner clone() throws CloneNotSupportedException {
        return (Inner) super.clone();
    }
}

class Outer implements Cloneable{
    private Inner inner;

    public Inner getInner() {
        return inner;
    }

    public void setInner(Inner inner) {
        this.inner = inner;
    }

    public Outer(Inner inner) {
        this.inner = inner;
    }

    @Override
    protected Outer clone() throws CloneNotSupportedException {
        Outer outer = (Outer) super.clone();
        outer.setInner(new Inner("inner")); // 拷贝一份内部对象
        return outer;
    }
}

@Test
public void testCopy() throws CloneNotSupportedException {
    Outer outer = new Outer(new Inner("inner"));
    Outer clone = outer.clone();
    System.out.println(outer.getInner() == clone.getInner());
    // 输出:false
}

标签:Java,name,clone,基础,Inner,Outer,拷贝,public,inner
From: https://www.cnblogs.com/afabao/p/17085971.html

相关文章

  • JavaScript的this指向详解
    一、概念:函数的上下文(this)由调用函数的方式决定,function是“运行时上下文”策略;函数如果不调用,则不能确定函数的上下文。二、规则:对象打点调用它的方法函数,......
  • java异常处理机制(黑马)
    异常体系的介绍我们现在学习的异常不是为了让我们的代码以后不出现异常的情况,而是当程序出现异常之后我们该怎样处理异常体系结构我们一般只需要管Exception就可以......
  • 《区块链基础知识25讲》-第六讲-所有权
    区块链可以用来管理和区分所有权所有权证明三要素对所有者的证明对事物被拥有的证明提供一个所有者与事物之间的连接区块链是一个能够被任何人访问,拥有类似账本功能的巨大去......
  • 《区块链基础知识25讲》-第七讲-双花问题
    三种含义复制数字产品引起的问题去中心化的点对点分布式账本种可能存在的问题完全分布式点对点系统种违反完备性的一个例子双花问题可以看作是去中心化点对点系统中数据一......
  • java AES加密
    1、引入maven<!--Base64编码需要--><dependency><groupId>org.apache.directory.studio</groupId><artifactId>org.apache.commons.cod......
  • Zookeeper算法基础
    第一章算法基础思考:Zookeeper是如何保证数据一致性的?这也是困扰分布式系统框架的一个难题。1.1拜占庭将军问题拜占庭将军问题是一个协议问题,拜占庭帝国军队的将军们......
  • 构建简单百万级别的消息推送基础模型
    问题场景:当用户量增大的时候,系统内的消息推送(比如系统内短信推送,微信,钉钉,极光个推推送)将是我们常见业务常见。当系统中的用户量逐渐增大时候,群发用户消息的推送也将成为......
  • Java 基础 - javaagent原理及实践
    JavaAgent是什么?javaagent本质上可以理解为一个jar包插件,这个jar包通过JVMTI(JVMToolInterface)完成加载,最终借助JPLISAgent(JavaProgrammingLanguageInstrumentation......
  • JavaScript高级编程
    JavaScript关键字break    default    finally    instanceof    this    varvoid   ......
  • java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException的解决方案
    问题原因:使用idea64runspringboot项目时出现这个错误:java.lang.NoClassDefFoundError:javax/xml/bind/JAXBException 解决方法:在pom.xml中添加以下依赖。<......