首页 > 代码库 > Object类clone方法的自我理解
Object类clone方法的自我理解
网上搜帖:
clone()是java.lang.Object类的protected方法,实现clone方法:
1)类自身需要实现Cloneable接口
2)需重写clone()方法,最好设置修饰符modifier为public,以便跨包调用。
浅拷贝与深拷贝
1.浅复制与深复制概念
⑴浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不
复制它所引用的对象。
⑵深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原
有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
2.Java的clone()方法
clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:
①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象
②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样
③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。
浅拷贝:
class A { String s = "a.1"; } class C implements Cloneable{ A a = new A(); int i = 14; @Override protected C clone() throws CloneNotSupportedException { return (C)super.clone(); } } public class Test_clone { public static void main(String[] args) { C c = new C(); c.a.s="a.2"; C c_c = null; try { c_c = c.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } System.out.println(c); System.out.println(c_c); System.out.println(c.a); System.out.println(c_c.a); } }
深拷贝:
class A implements Cloneable{ String s = "a.1"; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class C implements Cloneable{ A a = new A(); int i = 14; @Override protected C clone() throws CloneNotSupportedException { C c = (C)super.clone(); c.a = (A) a.clone();//对a进行clone() return c; } } public class Test_clone { public static void main(String[] args) { C c = new C(); c.a.s="a.2"; C c_c = null; try { c_c = c.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } System.out.println(c); System.out.println(c_c); System.out.println(c.a); System.out.println(c_c.a); } }
Object的clone()方法,是复制原来的对象的一切到新开辟的堆内存中。克隆对象中的基本类型,引用类型的引用都会被拷贝。所以深拷贝,就是对克隆对象内的引用类型,再clone()一次,开辟一个新的堆内存存放引用类型的对象。
Object类clone方法的自我理解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。