(Java基础篇)三、Java引用拷贝、浅拷贝、深拷贝

三种拷贝方法

  引用拷贝是拷贝变量的引用,浅拷贝在堆中创建一个新的对象,但是对象内部的引用还是指向同一个地址。深拷贝就是完全全新的变量。下面用一个例子展示。

class Tree implements Cloneable{
    public String name;

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

    @Override
    public Tree clone() throws CloneNotSupportedException {
        return (Tree) super.clone();
    }
}

class Fruit implements Cloneable{
    public String name;

    public Tree tree;

    public Fruit(String name, Tree tree) {
        this.name = name;
        this.tree = tree;
    }

    @Override
    public Fruit clone() {
        try {
            return (Fruit) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }

    public void print() {
        System.out.println(name + "长在" + tree.name + "上");
    }
}

public class TestCopy {
    public static void main(String[] args) {
        // 引用
        System.out.println("***引用拷贝***");
        Fruit apple = new Fruit("苹果", new Tree("苹果树"));
        apple.print();

        Fruit apple1 = apple;
        apple1.tree = new Tree("香蕉树");

        apple1.print();
        apple.print();

        // 浅拷贝
        System.out.println("***浅拷贝***");
        Fruit apple2 = new Fruit("苹果", new Tree("苹果树"));
        apple2.print();

        Fruit banana2 = apple2.clone();
        banana2.name = "香蕉";
        System.out.println(apple2.tree == banana2.tree);
        banana2.tree = new Tree("香蕉树");

        banana2.print();
        apple2.print();
    }
}

拷贝

  首先在引用拷贝中,添加了一个新的苹果(apple1),它由用引用拷贝创建,当修apple1.tree时由于是引用复制,导致apple.tree也被修改。
引用拷贝示意图

  其次在浅拷贝中,name和tree都创建了新的引用,虽然在创建之初指向的地址还是相同的,但是后续修改的时候会指向新的地址。例如new了一棵香蕉树,因为香蕉是浅拷贝,内部的tree在是新创建的,引用指向香蕉树的时候并不会影响苹果。所以苹果还是长在苹果树上,而香蕉则长在香蕉树上。另外,通过apple2.tree==banana2.tree可以发现,在浅拷贝之初指向的地址确实是同一个,这也是浅拷贝跟深拷贝不同之一。
浅拷贝
  深拷贝则是创建两个完全相互独立的变量。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值