标签:port 变量 int main 分享 浅拷贝 protected 浅拷贝与深拷贝 pre
网上搜帖:
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()一次,开辟一个新的堆内存存放引用类型的对象。
标签:port 变量 int main 分享 浅拷贝 protected 浅拷贝与深拷贝 pre
原文地址:http://www.cnblogs.com/jiaqingblog/p/6256580.html