美文网首页
Cloneable(浅拷贝,深拷贝)

Cloneable(浅拷贝,深拷贝)

作者: 78f6ced3a012 | 来源:发表于2019-05-26 23:30 被阅读0次

回忆:之前听一个老师提过,学语言就是学关键字,如果把所有的关键字都搞懂了,这门语言你就属于很熟悉了(很赞同这句话)。
实现Cloneable这个标记接口,重写Object的clone方法,完成拷贝功能
拷贝分为浅拷贝和深拷贝
如果拷贝的对象中的属性都是基本类型,使用浅拷贝就行,如果拷贝的对象中含有引用类型,就需要实现深拷贝
注意:实现深拷贝时,引用对象也要重写clone方法,如果引用对象是继承其他对象的话,上级对象也要重写clone方法。

对象

package com.example.java8.model.copy;
import java.math.BigDecimal;

public class Dog implements Cloneable {

    private Integer id;

    private String name;

    private BigDecimal weight;

    private Food food;

    public Dog(Integer id, String name, BigDecimal weight) {
        this.id = id;
        this.name = name;
        this.weight = weight;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public BigDecimal getWeight() {
        return weight;
    }

    public void setWeight(BigDecimal weight) {
        this.weight = weight;
    }

    public Food getFood() {
        return food;
    }

    public void setFood(Food food) {
        this.food = food;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", weight=" + weight +
                ", food=" + food +
                '}';
    }

    // 浅拷贝(使用时两者选其一)
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    // 深拷贝(使用时两者选其一)
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object object = super.clone();
        Food food = ((Dog) object).getFood();
        ((Dog) object).setFood((Food) food.clone());
        return object;
    }
}

引用对象

package com.example.java8.model.copy;

public class Food implements Cloneable {

    private String name;

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Food{" +
                "name='" + name + '\'' +
                '}';
    }

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

测试方法

package com.example.java8.model.copy;
import org.junit.Test;
import java.math.BigDecimal;

public class DogTest {

    // 测试浅拷贝
    @Test
    public void test() throws CloneNotSupportedException {
        Dog jack = new Dog(18, "jack", BigDecimal.TEN);
        Dog tom = (Dog) jack.clone();
        tom.setId(19);
        tom.setName("tom");
        tom.setWeight(BigDecimal.ONE);
        System.out.println(jack);
        System.out.println(tom);
    }

    // 测试深拷贝
    @Test
    public void test2() throws CloneNotSupportedException {
        Dog jack = new Dog(18, "jack", BigDecimal.TEN);
        jack.setFood(new Food("冰淇淋"));
        Dog tom = (Dog) jack.clone();
        tom.setId(19);
        tom.setName("tom");
        tom.setWeight(BigDecimal.ONE);
        tom.getFood().setName("三明治");
        System.out.println(jack);
        System.out.println(tom);
    }
}

相关文章

  • 深拷贝与浅拷贝的实现

    浅拷贝实现Cloneable接口 深拷贝实现Serializable接口

  • 原型模式

    简介 实现Cloneable接口,重写clone方法。要注意深拷贝和浅拷贝问题。 浅拷贝:新实例的...

  • Cloneable(浅拷贝,深拷贝)

    回忆:之前听一个老师提过,学语言就是学关键字,如果把所有的关键字都搞懂了,这门语言你就属于很熟悉了(很赞同这句话)...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • 原型模式

    必须实现Cloneable接口 浅拷贝:对基本数据类型进行值传递,对引用数据类型,直接引用旧地址值,此为浅拷贝。深...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

网友评论

      本文标题:Cloneable(浅拷贝,深拷贝)

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