Object的clone方法
回复数(0) 浏览数(46)
{{topic.upvote_count || 0}} 编辑 回复

一、克隆、浅克隆、深克隆介绍

1、克隆
指的是通过源对象,获得一个完全独立自主域的拷贝对象。拷贝的对象与源对象的状态一致。

2、浅克隆
对象通常有俩种域对象:值对象,引用对象。如果克隆的对象仅仅拥有独立的值对象、与源对象共同引用一个引用对象,我们将这种克隆称之为浅克隆。这时候,如果修改原对象引用对象的状态,克隆对象对应属性的状态也会发生改变。

3、深克隆
克隆对象拥有独立的值对象,还拥有独立的引用对象,我们将这种克隆称为深克隆。

二、实现克隆

1、浅克隆与深克隆实现效果一致
一般情况下,我们希望达到深克隆的效果。但有的时候,浅克隆的效果与深克隆的效果是一样的。比如说:
- 原始对象与浅克隆对象的共享子对象是不可变的。比如:String对象、final属性。

是不是觉得为什么String对象就没事?我如果改变原始对象得值,克隆对象难道不会跟着改变???
答案是不会!
这是因为String对象是个不可变对象。如果我修改String对象得值,会新建一个String对象,然后将这个对象得地址赋值给引用。

2、如何实现克隆方法?
- 实现克隆方法的类实现Conleable接口;
- 考虑浅克隆是否符合要求;
- 重写Objectclone方法;

Conleable接口是起标志作用,用于告诉使用这个类的其他人,这个类已经实现了克隆方法。

3、浅拷贝与深拷贝的写法
(1)如何实现浅拷贝?
java
public Employee clone() throws CloneNotSupportedException{
return (Employee)super.clone();
}

(2)如何实现深拷贝?
深拷贝就是克隆所有可变的实例域。
```java
public Employee clone() throws CloneNotSupportedException{
// 实现浅拷贝
Employee cloned = (Employee)super.clone();
// 将可变的实例域拷贝一下
cloned.hireDay = (Date)hireDay.clone();

return cloned;

}
```

不建议使用try、catch捕捉CloneNotSupportedException。因为这样这个类的子类就无法获取CloneNotSupportedException异常选择权。

{{topic.upvote_count || 0}}

一、克隆、浅克隆、深克隆介绍

1、克隆
指的是通过源对象,获得一个完全独立自主域的拷贝对象。拷贝的对象与源对象的状态一致。

2、浅克隆
对象通常有俩种域对象:值对象,引用对象。如果克隆的对象仅仅拥有独立的值对象、与源对象共同引用一个引用对象,我们将这种克隆称之为浅克隆。这时候,如果修改原对象引用对象的状态,克隆对象对应属性的状态也会发生改变。

3、深克隆
克隆对象拥有独立的值对象,还拥有独立的引用对象,我们将这种克隆称为深克隆。

二、实现克隆

1、浅克隆与深克隆实现效果一致
一般情况下,我们希望达到深克隆的效果。但有的时候,浅克隆的效果与深克隆的效果是一样的。比如说:
- 原始对象与浅克隆对象的共享子对象是不可变的。比如:String对象、final属性。

是不是觉得为什么String对象就没事?我如果改变原始对象得值,克隆对象难道不会跟着改变???
答案是不会!
这是因为String对象是个不可变对象。如果我修改String对象得值,会新建一个String对象,然后将这个对象得地址赋值给引用。

2、如何实现克隆方法?
- 实现克隆方法的类实现Conleable接口;
- 考虑浅克隆是否符合要求;
- 重写Objectclone方法;

Conleable接口是起标志作用,用于告诉使用这个类的其他人,这个类已经实现了克隆方法。

3、浅拷贝与深拷贝的写法
(1)如何实现浅拷贝?
java
public Employee clone() throws CloneNotSupportedException{
return (Employee)super.clone();
}

(2)如何实现深拷贝?
深拷贝就是克隆所有可变的实例域。
```java
public Employee clone() throws CloneNotSupportedException{
// 实现浅拷贝
Employee cloned = (Employee)super.clone();
// 将可变的实例域拷贝一下
cloned.hireDay = (Date)hireDay.clone();

return cloned;

}
```

不建议使用try、catch捕捉CloneNotSupportedException。因为这样这个类的子类就无法获取CloneNotSupportedException异常选择权。

46
回复 编辑