java 深克隆 浅克隆_java 浅克隆(浅复制)和深克隆(深复制)

浅克隆:

克隆得到的对象B跟原始对象A对比:A对象中属性的值相等,且A中对象B中对象是同一个对象,及内存地址为相同。

换言之:浅克隆只是把需要复制的对象的值复制了一遍,但关于其引用的其他对象只是复制了内存地址。

深克隆:

克隆得到的对象跟原始对象中所有属性和对象的值相等。且内存地址不同。

换言之:深复制把要复制的对象所引用的对象都复制了一遍。

举例说明:

package com.clone;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

public class User implements Serializable,Cloneable{

/**

* 序列化版本号

*/

private static final long serialVersionUID = 1L;

protected User user;

protected String id;

protected String name;

protected String phone;

protected Integer x;

public Integer getX() {

return x;

}

public void setX(Integer x) {

this.x = x;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

@Override

protected Object clone() throws CloneNotSupportedException {

return super.clone();

}

public Object deepClone() throws Exception {

ByteArrayOutputStream bo = new ByteArrayOutputStream();

new ObjectOutputStream(bo).writeObject(this);

return new ObjectInputStream(new ByteArrayInputStream(bo.toByteArray())).readObject();

}

}

package com.clone;

public class Test {

public static void main(String[] args) {

User u = new User();

u.setId("sdsdsdaxzsdsdeqebd");

u.setName("张三丰");

u.setPhone("110");

u.setX(10);

User u4 = new User();

u4.setId("22");

u4.setName("22");

u4.setPhone("22");

u.setUser(u4);

try {

System.out.println("=============浅克隆=============");

User u2 = (User) u.clone();

System.out.println(u2.getId());

System.out.println(u2.getName());

System.out.println(u2.getPhone());

System.out.println(u2.getUser().getPhone());

System.out.println("u2.getUser() == u.getUser() ? " + (u2.getUser() == u.getUser()));

u2.getUser().setId("111111111111111");

u2.setId("xxxxxxxxxxxxxxxxxxxxx");

System.out.println(u.getUser().getId());

System.out.println(u.getId());

System.out.println();

System.out.println("=============深克隆=============");

User u3 = (User) u.deepClone();

System.out.println(u3.getId());

System.out.println(u3.getName());

System.out.println(u3.getPhone());

System.out.println(u3.getUser().getPhone());

System.out.println("u3.getUser() == u.getUser() ? " + (u3.getUser() == u.getUser()));

u3.getUser().setId("3333333333333");

System.out.println(u.getUser().getId());

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}catch (Exception e) {

e.printStackTrace();

}

}

}

输出结果:

=============浅克隆=============

sdsdsdaxzsdsdeqebd

张三丰

110

22

u2.getUser() == u.getUser() ? true

111111111111111

sdsdsdaxzsdsdeqebd

=============深克隆=============

sdsdsdaxzsdsdeqebd

张三丰

110

22

u3.getUser() == u.getUser() ? false

111111111111111

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值