java深复制的两种实现方式

深复制的两种实现方式

1.重写clone方法
package com.entity;

import lombok.Data;

/**
 * @Author: zhaokj
 * @Date: 2021/11/14/10:23
 * @Description:
 **/
@Data
public class Team implements Cloneable {
    private String name;
    private String org;
@Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}
@Test
public void test3(){
   Team team = new Team();
   team.setOrg("NBA");
   team.setName("lakers");
    System.out.println(team);
    try{
         Team team1= (Team)team.clone();
         team1.setName("lonng");
         team1.setOrg("cba");
        System.out.println(team);
        System.out.println(team1);

    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eXXzU1Np-1636956887438)(/Users/zhaokaijie/Library/Application Support/typora-user-images/image-20211115104257479.png)]

package com.entity;

import lombok.Data;

/**
 * @Author: 
 * @Date: 2021/11/14/10:22
 * @Description:
 **/
@Data
public class Player implements Cloneable {
    private String name;
    private String age;
    private Team team;
    @Override
//    public Object clone() throws CloneNotSupportedException {
//        return super.clone();
//    }
// clone 深复制
    public Object clone() throws CloneNotSupportedException{
        Player newPlayer = (Player) super.clone();
        newPlayer.team = (Team) team.clone();
        return newPlayer;
    }
@Test
public void test1(){


    Team team = new Team();
    team.setName("湖人");
    team.setOrg("NBA");

    Player player = new Player();
    player.setName("科比");
    player.setAge("41");
    player.setTeam(team);

    System.out.println(player);

    try {
        Player player1 =(Player) player.clone();
        player1.setName("pl kobe");
        player1.setAge("42");
        Team team1 = player1.getTeam();
        System.out.println(team1);
        team1.setName("China");
        team1.setOrg("world");
        player1.setTeam(team1);
        System.out.println("复制后的:player =" +player );
        System.out.println("复制后的:player1 =" +player1 );

    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zr3yNpP3-1636956887461)(/Users/zhaokaijie/Library/Application Support/typora-user-images/image-20211115105327754.png)]

2.通过序列化实现Serializable
package com.kkb.cubemall.search.entity;

import lombok.Data;

import javax.sql.rowset.serial.SerialBlob;
import java.io.Serializable;

/**
 * @Author: zhaokj
 * @Date: 2021/11/15/10:59
 * @Description:
 **/
@Data
public class Band implements Serializable {
    private static final long serialVersionUID = -91562514757933656L;
    private String name;
    private Org org;

}
package com.kkb.cubemall.search.entity;

import lombok.Data;

import java.io.Serializable;

/**
 * @Author: zhaokj
 * @Date: 2021/11/15/11:25
 * @Description:
 **/
@Data
public class Org implements Serializable {
    private static final long serialVersionUID = 6159790799802084609L;
    private String name;
    private String addr;
}
@Test
public void test4(){


    Band band = new Band();
    band.setName("Macbook");
    Org org = new Org();
    org.setAddr("chaina");
    org.setName("iphone");
    band.setOrg(org);
    System.out.println(band);
    Band clone = SerializationUtils.clone(band);
    System.out.println("被克隆的对象:" + band.hashCode() + "\n" +
            "被克隆的对象内的org属性" + band.getOrg().hashCode() + "     " + band.toString());
    System.out.println("克隆出来的对象:" + clone.hashCode() + "\n" +
            "克隆出来的对象内的org属性" + clone.getOrg().hashCode() + "     " + clone.toString());
    System.out.println("---------------------上面是直接进行深复制,不改变复制后的对象任何值------------------");
    Band band1 = new Band();
    band.setName("serface");
    Org org1 = new Org();
    org1.setAddr("chaina");
    org1.setName("weiruan");
    band1.setOrg(org);
    System.out.println(band1);
    Band clone1 = SerializationUtils.clone(band1);
    band1.setName("thikpad");
    System.out.println("被克隆的对象:" + band1.hashCode() + "\n" +
            "被克隆的对象内的org属性" + band1.getOrg().hashCode() + "     " + band1.toString());
    System.out.println("克隆出来的对象:" + clone1.hashCode() + "\n" +
            "克隆出来的对象内的org属性" + clone1.getOrg().hashCode() + "     " + clone1.toString());
    System.out.println("---------------------上面是直接进行深复制,不改变引用类属性------------------");
    Band band2 = new Band();
    band2.setName("mi10");
    Org org2 = new Org();
    org2.setAddr("chaina");
    org2.setName("xiaomi");
    band2.setOrg(org2);
    System.out.println(band2);
    Band clone2 = SerializationUtils.clone(band2);
    clone2.setOrg(org);
    System.out.println("被克隆的对象:" + band2.hashCode() + "\n" +
            "被克隆的对象内的org属性" + band2.getOrg().hashCode() + "     " + band2.toString());
    System.out.println("克隆出来的对象:" + clone2.hashCode() + "\n" +
            "克隆出来的对象内的org属性" + clone2.getOrg().hashCode() + "     " + band2.toString());
    System.out.println("---------------------上面是直接进行深复制,不改变基本类型对象任何值------------------");



}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hJxUVLWJ-1636956887463)(/Users/zhaokaijie/Library/Application Support/typora-user-images/image-20211115140904843.png)]

1.即使是深复制,不改动其中的任何值的情况向仍指向同一个地址

2.经过深复制A得到B,对B的基本属性进行修改,属性对应的地址不变,B的地址改变

3.经过深复制A得到B,对B的引用属性进行修改,属性对应的地址不变,B的地址也改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值