美文网首页
对象的拷贝

对象的拷贝

作者: itfitness | 来源:发表于2021-09-17 17:45 被阅读0次

目录

原理

Object类已经实现了clone方法,它底层使用的native方法,这里只需要我们实现Cloneable这个标记接口,并实现clone()方法即可


实现步骤

1.定义实体类并实现Cloneable接口

这里我定义了两个实体类,Computer和Cpu,Cpu是作为Computer的属性存在的,我们都实现了Cloneable接口,并且重写了clone()方法当然也是直接调用的父类的clone()方法

public class Computer implements Cloneable{
    private double price;
    private Cpu cpu;

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public Cpu getCpu() {
        return cpu;
    }

    public void setCpu(Cpu cpu) {
        this.cpu = cpu;
    }

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

    @Override
    public String toString() {
        return "Computer{" +
                "price=" + price +
                ", cpu=" + cpu +
                '}';
    }
}
public class Cpu implements Cloneable{
    private String name;
    private String architecture;

    public String getName() {
        return name;
    }

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

    public String getArchitecture() {
        return architecture;
    }

    public void setArchitecture(String architecture) {
        this.architecture = architecture;
    }

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

    @Override
    public String toString() {
        return "Cpu{" +
                "name='" + name + '\'' +
                ", architecture='" + architecture + '\'' +
                '}';
    }
}
2.main方法中调用

我们在main方法中测试拷贝

public class Main {

    public static void main(String[] args) {
        try {
            Computer computer = new Computer();
            Cpu cpu = new Cpu();
            cpu.setName("AMD");
            cpu.setArchitecture("X86");
            computer.setPrice(1000);
            computer.setCpu(cpu);


            Computer computerCopy = (Computer) computer.clone();
            computerCopy.setPrice(2000);
            computerCopy.getCpu().setArchitecture("ARM");
            computerCopy.getCpu().setName("Intel");
            System.out.println("原Computer"+computer.toString());
            System.out.println("拷贝Computer"+computerCopy.toString());
        }catch (Exception e){
        }
    }
}

结果如下



我们发现修改了拷贝Computer对象的价格对原对象没有影响,但是修改了拷贝对象的Cpu的属性却导致了原对象也发生了改变,这是因为我们调用拷贝方法所产生的对象的属性如果是非基础类型那它只是引用了被拷贝对象的属性,我们称它为浅拷贝,如果我们想要完全分离的话就要进行深拷贝。

3.解决浅拷贝的问题

我们需要修改下Computer的clone()方法,在clone()方法中我们需要加上Cpu的拷贝,如下

@Override
    protected Object clone() throws CloneNotSupportedException {
        Computer computer = (Computer) super.clone();
        Cpu cpu = (Cpu) computer.getCpu().clone();
        computer.setCpu(cpu);
        return computer;
    }

这时我们再运行程序,结果如下


相关文章

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • Java-序列化—(三)序列化实现深拷贝

    浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象...

  • Objective-C中的深拷贝与浅拷贝

    一、概念 浅拷贝——只拷贝指向对象的指针,不拷贝引用对象本身。 深拷贝——拷贝引用对象本身。将对象obj,拷贝后得...

  • iOS - copy与mutableCopy

    浅拷贝与深拷贝 浅拷贝:指针拷贝,不产生新的对象,源对象的引用计数器+1 深拷贝:对象拷贝,会产生新的对象,源对象...

  • 前端笔记(二) 对象的深浅拷贝,函数的防抖与节流,函数柯里化 ,

    对象的深浅拷贝 对象的深拷贝与浅拷贝的区别: 浅拷贝:仅仅复制对象的引用, 而不是对象本身。 深拷贝:把复制的对象...

  • 引用赋值和浅拷贝和深拷贝

    1.对象的引用赋值 2.对象的浅拷贝 浅拷贝:是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象...

  • 深拷贝和浅拷贝不同

    浅拷贝:指针(地址)拷贝,不会产生新对象深拷贝:内容拷贝,会产生新对象 非容器类对象的深拷贝、浅拷贝 非容器类对象...

  • 深浅copy

    概念:浅拷贝:不拷贝对象,只拷贝对象指针,因此不会产生新的对象。深拷贝:拷贝对象到新的内存,因此会产生新的对象。 ...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 copy.deepcopy 深拷贝 拷贝对...

网友评论

      本文标题:对象的拷贝

      本文链接:https://www.haomeiwen.com/subject/rphsgltx.html