Objcet.clone() 和Cloneable 接口

来源:互联网 发布:linux ansi转unicode 编辑:程序博客网 时间:2024/05/18 01:01
/* *Object 没有实现 Cloneable接口 ,所以如果其子类 没实现 Cloneable,就调用 *   super.clone();  会在运行时 throws CloneNotSupportedException *      Object里的clone(),的访问符是 protected      *   浅表复制:类A实现 了Cloneable接口(重写clone方法),而其 属性类型 有些没实现 ,,则 *               clone()后:  类A中 属性类型实现 了Cloneable接口的会被复制, *                  没实现的,则还是同一个引用, 一旦改变副本,原本 也改变 *   深层复制:类A实现 了Cloneable接口(重写clone方法),而其 属性类型 都实现 ,,则 *    clone()后: 类A 的所有属性都被复制,,生成的是真正的副本, *                          改变副本,不影响 原本 */public class CloneableClone {public static void main(String[] args) {MyTest mt = new MyTest();mt.name = "中华";MyClone myClone = new MyClone(mt);System.out.println("before clone()----" + myClone);myClone.cc = 88;MyClone myClone2 = (MyClone) myClone.clone();System.out.println("after clone()----" + myClone2);System.out.println("after clone() cc m2.value----" + myClone2.cc);myClone2.mt.name = "admin";myClone2.a = 99;myClone2.mt.is = 110;myClone2.cc = 100;System.out.println("after clone() modify cc,m.value----" + myClone.cc);System.out.println("after clone() modify cc,m2.value----" + myClone2.cc);System.out.println(myClone);// mt没有多出一个,还是原来那个,所以mt中的属性都被改变System.out.println(myClone2);// 对于int属性,没有改变原值 ,可以看出,是真正的拷贝,是不同的引用System.out.println(myClone.hashCode());System.out.println(myClone2.hashCode());Integer in = new Integer(8);// 等基本数据封装类还String,没有clone方法/* 没有clone方法的类,就表示 不能继承后调用 父类的clone(), *   这些包装类,修饰的 属性,,可以被 复制  */System.out.println("深层复制 :**************");MyTest2 mt2 = new MyTest2();MyCloneY mcy = new MyCloneY(mt2);System.out.println("before clone()---" +mcy);MyCloneY mcy2 = mcy.clone();System.out.println("after clone()---" +mcy2);mcy2.ab = 10;mcy2.mt2.xy = 30;System.out.println("after clone(),modify,primitive objcet ---" +mcy);System.out.println("after clone(),modify ---" +mcy2);}}class MyClone implements Cloneable {public int a = 10;public MyTest mt;Integer cc = 0;public MyClone(MyTest mt) {this.mt = mt;}@Overridepublic Object clone() {Object obj = null;try {obj = super.clone();} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();}return obj;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "a:" + this.a + "  mtName:" + this.mt.name + " mtIs:"+ this.mt.is;}}class MyTest {String name = "无法无天";int is = 100;}class MyCloneY implements Cloneable {int ab=5;MyTest2 mt2;public MyCloneY(MyTest2 mt2) {this.mt2 = mt2;}@Overridepublic MyCloneY clone() {MyCloneY mcy = null;try {mcy = (MyCloneY) super.clone();mcy.mt2 = (MyTest2) this.mt2.clone();} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();}return mcy;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "ab:" + this.ab + "  mt2.xy:" + this.mt2.xy;}}class MyTest2 implements Cloneable{int xy = 10;@Overridepublic Object clone() {Object obj = null;try {obj = super.clone();} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();}return obj;}}


 

原创粉丝点击