克隆

Java对象复制

五迷三道 提交于 2019-12-09 09:51:08
1.Java对象复制概念 1.1 浅复制(浅克隆) 复制的对象的所有变量与含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 1.2 深复制(深度克隆) 复制的对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向复制的新对象,而不是原来的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。 2.Java对象的clone()克隆方法 2.1 clone方法 clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足 对任何的对象x,都有x.clone() != x;也即克隆的对象与原对象不是同一个对象,他们有不同的内存地址 对任何的对象x,都有x.clone().getClass() == x.getClass(),也即克隆对象与原对象的类型一致。 如果对象x的equals()方法定义恰当,那么x.clone().equal(x)应该成立。 2.2 Java中对象的克隆 为了获取对象的一份拷贝,我们可以利用Object的clone()方法 在派生类中覆盖基类的clone()方法,并声明为public 在派生类的clone()方法中,调用super.clone()。 在派生类中实现Cloneable接口 2.3 示例 2.3.1

Java中的克隆Cloneable

杀马特。学长 韩版系。学妹 提交于 2019-12-03 21:49:40
浅克隆与深克隆 当拷贝一个变量时,原始变量与拷贝变量引用了同一个对象。那么当改变一个变量所引用的对象时,就会对另一个变量产生影响。形象化一点说,就像某人A有一把遥控,用来控制电视,他把遥控交给了B,B用遥控来改变电视台,则对 A来说,他看的节目台也发生相应变化。 Employee e1 =new Employee(“John”,5000); Employee e2=e1; e2.raiseSalary(500); 那么,如果我们希望得到一个拷贝,它与原拷贝互不影响,则就引入了克隆的概念。 Employee e2=e1.clone(); 这会产生一个新的Employee对象e2,它与被克隆对象e1有相同的属性。并且e2与e1互不影响。 浅克隆 clone()方法是object类的proteced方法,由于这个类对于具体类一无所知,所以只能对各个域进行拷贝。 如果原始对象与拷贝对象的共享的子对象是不可变的,将不会产生任何问题。 例如, ①对象中的所有数据域是数值或基本类型 ② 像String这样不允许改变的类 ③ 在其生命周期中不会发生变化,既没有修改它们的方法,也没有创建对 它们的引用 的方法 浅克隆 域中 包含对象的引用 ,则会使得克隆后的对象和以前的对象有着相同引用的域。这种只是单纯进行域的拷贝就称作 浅克隆 ,而默认的方法就是浅克隆。 深克隆 但是