Java clone
2016-05-18 17:46
447 查看
假设现在有一个Employee对象,Employee tobby =new Employee(“CMTobby”,5000),通常我们会有这样的赋值Employee
cindyelf=tobby,这个时候只是简单了copy了一下reference,cindyelf和tobby都指向内存中同一个object,这样cindyelf或者tobby的一个操作都可能影响到对方。打个比方,如果我们通过cindyelf.raiseSalary()方法改变了salary域的值,那么tobby通过getSalary()方法得到的就是修改之后的salary域的值,显然这不是我们愿意看到的。
我们希望得到tobby的一个精确拷贝,同时两者互不影响,这时候我们就可以使用Clone来满足我们的需求。Employee cindy=tobby.clone(),这时会生成一个新的Employee对象,并且和tobby具有相同的属性值和方法。
如果仅仅clone基本类型变量,叫做浅拷贝。如果想克隆引用类型变量,需要实现Cloneable接口。
class Employee implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Employee cloned = (Employee) super.clone();
cloned.hireDay = (Date) hireDay.clone();
return cloned;
}
}
Clone()方法的使用比较简单,注意如下几点即可:a. 什么时候使用shallow Clone,什么时候使用deep Clone,这个主要看具体对象的域是什么性质的,基本型别还是reference variableb.
调用Clone()方法的对象所属的类(Class)必须implements Clonable接口,否则在调用Clone方法的时候会抛出CloneNotSupportedException。
cindyelf=tobby,这个时候只是简单了copy了一下reference,cindyelf和tobby都指向内存中同一个object,这样cindyelf或者tobby的一个操作都可能影响到对方。打个比方,如果我们通过cindyelf.raiseSalary()方法改变了salary域的值,那么tobby通过getSalary()方法得到的就是修改之后的salary域的值,显然这不是我们愿意看到的。
我们希望得到tobby的一个精确拷贝,同时两者互不影响,这时候我们就可以使用Clone来满足我们的需求。Employee cindy=tobby.clone(),这时会生成一个新的Employee对象,并且和tobby具有相同的属性值和方法。
如果仅仅clone基本类型变量,叫做浅拷贝。如果想克隆引用类型变量,需要实现Cloneable接口。
class Employee implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Employee cloned = (Employee) super.clone();
cloned.hireDay = (Date) hireDay.clone();
return cloned;
}
}
Clone()方法的使用比较简单,注意如下几点即可:a. 什么时候使用shallow Clone,什么时候使用deep Clone,这个主要看具体对象的域是什么性质的,基本型别还是reference variableb.
调用Clone()方法的对象所属的类(Class)必须implements Clonable接口,否则在调用Clone方法的时候会抛出CloneNotSupportedException。
相关文章推荐
- java 合并文件
- JavaGC(3)-Java垃圾回收优化
- 解决Eclipse Debug source not found问题
- RxJava变换
- java 多线程
- java中FileInputStream,FileReader等的区别
- eclipse clean后不能自动编译生成class文件的问题
- 转解决java向pdf中写值
- java ThreadLocal 自己的一些见解
- Java 内部类种类及使用解析
- java web工程启动socket服务
- java.lang.IllegalStateException: Could not find a method false(View) in the activity class com.xuan
- Java学习-30天
- math.random()和Math.round的区别
- springmvc自动转前台传来的时间数据
- Java : java.util.ConcurrentModificationException
- Spring事务传播机制和数据库隔离级别
- java web 项目启动开启 socket server 作者:Mchange
- eclipse错误: 找不到或无法加载主类解决过程
- java初始化顺序