Cloneable和clone的使用,以及深复制与浅复制的区别
来源:互联网 发布:如何评价电锯惊魂知乎 编辑:程序博客网 时间:2024/06/09 22:51
一.Cloneable 的用途
Cloneable和Serializable一样都是标记型接口,它们内部都没有方法和属性,implements Cloneable表示该对象能被克隆,能使用Object.clone()方法。如果没有implements Cloneable的类调用Object.clone()方法就会抛出CloneNotSupportedException。
二.克隆的分类
(1)浅克隆(shallow clone),浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
(2)深克隆(deep clone),深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
举例区别一下:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2中包含对C2(C1的copy)的引用。
三.克隆的举例
要让一个对象进行克隆,其实就是两个步骤:
1. 让该类实现java.lang.Cloneable接口;
四.浅克隆的举例
如果要深克隆,需要重写(override)Object类的clone()方法,并且在方法内部调用持有对象的clone()方法;注意如下代码的clone()方法
Cloneable和Serializable一样都是标记型接口,它们内部都没有方法和属性,implements Cloneable表示该对象能被克隆,能使用Object.clone()方法。如果没有implements Cloneable的类调用Object.clone()方法就会抛出CloneNotSupportedException。
二.克隆的分类
(1)浅克隆(shallow clone),浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
(2)深克隆(deep clone),深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
举例区别一下:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2中包含对C2(C1的copy)的引用。
三.克隆的举例
要让一个对象进行克隆,其实就是两个步骤:
1. 让该类实现java.lang.Cloneable接口;
2. 重写(override)Object类的clone()方法。
public class Wife implements Cloneable {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Wife(int id,String name) {this.id = id;this.name = name;}@Overridepublic int hashCode() {//myeclipse自动生成的final int prime = 31;int result = 1;result = prime * result + id;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {//myeclipse自动生成的if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Wife other = (Wife) obj;if (id != other.id)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}/** * @param args * @throws CloneNotSupportedException */public static void main(String[] args) throws CloneNotSupportedException {Wife wife = new Wife(1,"wang");Wife wife2 = null;wife2 = (Wife) wife.clone();System.out.println("class same="+(wife.getClass()==wife2.getClass()));//trueSystem.out.println("object same="+(wife==wife2));//falseSystem.out.println("object equals="+(wife.equals(wife2)));//true}}
四.浅克隆的举例
public class Husband implements Cloneable {private int id;private Wife wife;public Wife getWife() {return wife;}public void setWife(Wife wife) {this.wife = wife;}public int getId() {return id;}public void setId(int id) {this.id = id;}public Husband(int id) {this.id = id;}@Overridepublic int hashCode() {//myeclipse自动生成的final int prime = 31;int result = 1;result = prime * result + id;return result;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}@Overridepublic boolean equals(Object obj) {//myeclipse自动生成的if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Husband other = (Husband) obj;if (id != other.id)return false;return true;}/** * @param args * @throws CloneNotSupportedException */public static void main(String[] args) throws CloneNotSupportedException {Wife wife = new Wife(1,"jin");Husband husband = new Husband(1);Husband husband2 = null;husband.setWife(wife);husband2 = (Husband) husband.clone();System.out.println("husband class same="+(husband.getClass()==husband2.getClass()));//trueSystem.out.println("husband object same="+(husband==husband2));//falseSystem.out.println("husband object equals="+(husband2.equals(husband)));//trueSystem.out.println("wife class same="+(husband.getWife().getClass()==husband2.getWife().getClass()));//trueSystem.out.println("wife object same="+(husband.getWife()==husband2.getWife()));//trueSystem.out.println("wife object equals="+(husband.getWife().equals(husband.getWife())));//true}}五.深克隆的举例
如果要深克隆,需要重写(override)Object类的clone()方法,并且在方法内部调用持有对象的clone()方法;注意如下代码的clone()方法
public class Husband implements Cloneable {private int id;private Wife wife;public Wife getWife() {return wife;}public void setWife(Wife wife) {this.wife = wife;}public int getId() {return id;}public void setId(int id) {this.id = id;}public Husband(int id) {this.id = id;}@Overridepublic int hashCode() {//myeclipse自动生成的final int prime = 31;int result = 1;result = prime * result + id;return result;}@Overrideprotected Object clone() throws CloneNotSupportedException {Husband husband = (Husband) super.clone();husband.wife = (Wife) husband.getWife().clone();return husband;}@Overridepublic boolean equals(Object obj) {//myeclipse自动生成的if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Husband other = (Husband) obj;if (id != other.id)return false;return true;}/** * @param args * @throws CloneNotSupportedException */public static void main(String[] args) throws CloneNotSupportedException {Wife wife = new Wife(1,"jin");Husband husband = new Husband(1);Husband husband2 = null;husband.setWife(wife);husband2 = (Husband) husband.clone();System.out.println("husband class same="+(husband.getClass()==husband2.getClass()));//trueSystem.out.println("husband object same="+(husband==husband2));//falseSystem.out.println("husband object equals="+(husband.equals(husband)));//trueSystem.out.println("wife class same="+(husband.getWife().getClass()==husband2.getWife().getClass()));//trueSystem.out.println("wife object same="+(husband.getWife()==husband2.getWife()));//falseSystem.out.println("wife object equals="+(husband.getWife().equals(husband.getWife())));//true}}但是也有不足之处,如果Husband内有N个对象属性,突然改变了类的结构,还要重新修改clone()方法。解决办法:可以使用Serializable运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
0 0
- Cloneable和clone的使用,以及深复制与浅复制的区别
- 浅复制和深复制 clone()的使用
- php5对象复制、clone、浅复制与深复制的区别与介绍
- 接口Cloneable浅复制和深复制
- Java克隆clone的浅复制与深复制
- clone 深复制与浅复制 讲的很清晰
- Java中Clone方法的浅复制和深复制
- clone方法的深复制和浅复制
- Java Object的clone方法浅复制和深复制
- Cloneable 和 clone()的总结和使用
- Cloneable 和 clone()的总结和使用
- Java中clone方法以及深复制和浅复制
- 关于Java对象复制(Clone、深度Clone以及序列化与反序列化的使用)
- 浅复制与深复制的区别
- 深复制与浅复制的区别
- 结合实例详解clone()函数,Cloneable接口以及深拷贝与浅拷贝的问题
- 结合实例详解clone()函数,Cloneable接口以及深拷贝与浅拷贝的问题
- 浅复制和深复制的区别?
- Android触屏事件传递(个人实践总结)
- TCP与UDP的区别,以及它们各自的定义
- 第五周 项目三 用多文件组织多个类的程序
- OpenGL ES之GLSurfaceView学习一:介绍
- DirectX11-Sample-Tutorial02-初始化窗口-利用d3d绘制三角面片
- Cloneable和clone的使用,以及深复制与浅复制的区别
- jquery对radio、checkbox、select的操作
- 网络文件系统挂载实现
- IBM系统存储解决方案
- Http1.1协议中返回内容中的Transfer-Encoding的作用
- 大型网站技术架构的演进
- Valid Pattern Lock --dfs
- openssl 安装包地址
- android各种对话框