深复制的两种实现方式
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("---------------------上面是直接进行深复制,不改变基本类型对象任何值------------------");
}
1.即使是深复制,不改动其中的任何值的情况向仍指向同一个地址
2.经过深复制A得到B,对B的基本属性进行修改,属性对应的地址不变,B的地址改变
3.经过深复制A得到B,对B的引用属性进行修改,属性对应的地址不变,B的地址也改变