java对象克隆的例子,Java对象之深克隆和浅克隆

**浅克隆:** 只copy对象引用,不copy对象本身。即对象地址不变,仍然只存在一个对象。

例如: `User user1 = new User; User user2 = user1;`

这里引用类型对象地址不变,只是将user2的引用指向user1的地址。

浅克隆代码示例:

Bean:

public class User {

private Integer id;

private String name;

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;

}

@Override

public String toString() {

return "User{" +

"id=" + id +

", name='" + name + '\'' +

'}';

}

}

Main:

public class TestMain {

public static void main(String[] args) throws CloneNotSupportedException {

User user = new User();

user.setId(1);

user.setName("AAA");

User user2 = user;

user2.setName("BBB");

System.out.println(user);

System.out.println(user2);

}

}

运行结果:

User{id=1, name='BBB'}

User{id=1, name='BBB'}

**深克隆:** 不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。也就是clone出来的是一个全新的对象,引用地址不同,但是内容相同(跟新new对象进行相同赋值效果一样,但是速度更快:因为clone是一个native方法)。

深克隆分为三步:

1. 对象的类实现Cloneable接口(必须,否则会抛出CloneNotSupportedException异常);

2. 覆盖Object类的clone()方法 (覆盖clone()方法,将访问修饰符改为public,默认是protected);

3. 在clone()方法中调用super.clone();

**深克隆示例:**

Bean:

/**

* @author :zhangh

* @description :

* @date :Created at 2019/6/3 10:03

* Modified at 2019/6/3 10:03

*/

/**

对象的类实现Cloneable接口;

覆盖Object类的clone()方法 (覆盖clone()方法,访问修饰符设为public,默认是protected);

在clone()方法中调用super.clone();

*/

public class User implements Cloneable{

private Integer id;

private String name;

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;

}

@Override

public String toString() {

return "User{" +

"id=" + id +

", name='" + name + '\'' +

'}';

}

@Override

public User clone() throws CloneNotSupportedException {

return (User) super.clone();

}

}

Main:

/**

* @author :zhangh

* @description :

* @date :Created at 2019/6/3 10:02

* Modified at 2019/6/3 10:02

*/

public class TestMain {

public static void main(String[] args) throws CloneNotSupportedException {

User user = new User();

user.setId(1);

user.setName("AAA");

User user2 = user.clone();

user2.setName("BBB");

System.out.println(user);

System.out.println(user2);

}

}

运行结果:

User{id=1, name='AAA'}

User{id=1, name='BBB'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值