clone() 方法的思考

本文通过示例代码详细介绍了Java中对象拷贝的浅拷贝和深拷贝概念,展示了如何使用clone()方法进行拷贝操作,并解释了何时需要实现深拷贝以避免引用相同内存地址的问题。同时,给出了实现完全深拷贝的示例代码,展示了如何为类的成员变量也实现clone方法来确保独立的内存空间。
摘要由CSDN通过智能技术生成

Clone()

clone()方法,可以申请一个和被调用对象一样的空间

然后,将被调用对象的成员变量,赋到新申请的空间中

只是,这些成员变量,如果也是的话,执行的就是浅拷贝

比如下面这样:

public class MyCloneTest2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Face2 face = new Face2(new Teeth2(4,4));
        Face2 face1 = (Face2) face.clone();
        System.out.println("调用 clone 方法的 face 对象是否地址相等:"+(face==face1));
        System.out.println("两个 face 对象的成员变量 Teeth 是否地址相等:"+(face.getTeeth2()==face1.getTeeth2()));

        System.out.println(face);
        System.out.println(face1);
    }
}

class Face2 implements Cloneable {
    private Teeth2 teeth;

    public Face2(Teeth2 teeth) {
        this.teeth = teeth;
    }

    public Face2() {
    }

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

    public Teeth2 getTeeth2() {
        return teeth;
    }

    public void setTeeth2(Teeth2 teeth) {
        this.teeth = teeth;
    }

    @Override
    public String toString() {
        return "Face2{" +
                "teeth=" + teeth +
                '}';
    }
}

class Teeth2 implements Cloneable {
    private int intNum;
    private Integer IntegerNum;

    public Teeth2(int intNum, Integer integerNum) {
        this.intNum = intNum;
        IntegerNum = integerNum;
    }

    public Teeth2() {
    }

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

    public int getIntNum() {
        return intNum;
    }

    public void setIntNum(int intNum) {
        this.intNum = intNum;
    }

    public Integer getIntegerNum() {
        return IntegerNum;
    }

    public void setIntegerNum(Integer integerNum) {
        IntegerNum = integerNum;
    }

    @Override
    public String toString() {
        return "Teeth2{" +
                "intNum=" + intNum +
                ", IntegerNum=" + IntegerNum +
                '}';
    }
}

image-20210412113955148

结果如下:

image-20210412113351270






如果希望实现完全的深拷贝,那成员变量也需要实现Cloneable接口,并重写 clone 方法

public class MyCloneTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Face face = new Face(new Teeth(4,4));
        Face face1 = (Face) face.clone();
        System.out.println(face==face1);
        System.out.println(face.getTeeth()==face1.getTeeth());
        System.out.println(face.getTeeth().getIntegerNum()==face1.getTeeth().getIntegerNum());
        System.out.println(face);
        System.out.println(face1);
    }
}


class Face implements Cloneable {
    private Teeth teeth;

    public Face(Teeth teeth) {
        this.teeth = teeth;
    }

    public Face() {
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Face face = (Face) super.clone();
        face.setTeeth((Teeth) this.teeth.clone());
        return face;
    }

    public Teeth getTeeth() {
        return teeth;
    }

    public void setTeeth(Teeth teeth) {
        this.teeth = teeth;
    }

    @Override
    public String toString() {
        return "Face{" +
                "teeth=" + teeth +
                '}';
    }
}

class Teeth implements Cloneable {
    private int intNum;
    private Integer IntegerNum;

    public Teeth(int intNum, Integer integerNum) {
        this.intNum = intNum;
        IntegerNum = integerNum;
    }

    public Teeth() {
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Teeth teeth = (Teeth) super.clone();
        teeth.setIntegerNum(new Integer(this.IntegerNum));
        return teeth;
    }

    public int getIntNum() {
        return intNum;
    }

    public void setIntNum(int intNum) {
        this.intNum = intNum;
    }

    public Integer getIntegerNum() {
        return IntegerNum;
    }

    public void setIntegerNum(Integer integerNum) {
        IntegerNum = integerNum;
    }

    @Override
    public String toString() {
        return "Teeth{" +
                "intNum=" + intNum +
                ", IntegerNum=" + IntegerNum +
                '}';
    }
}

image-20210412113626461

image-20210412113650816

结果如下:

image-20210412113739963

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FARO_Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值