JAVA面12-克隆与序列化

克隆的好处
方便,性能高

引用复制问题

public class T18 {
    public static void main(String[] args) {
        int number =1;
        int number2=number;
        System.out.println(number);  1
        System.out.println(number);  1
        System.out.println("=======");
        number2=2;
        System.out.println(number);  1
        System.out.println(number2); 2
        System.out.println("=======");

        Dog dog=new Dog();
        dog.name="lili";
        dog.age=3;
        Dog dog2=dog;
        System.out.println(dog.name+" "+dog.age); lili 3
        System.out.println(dog2.name+" "+dog2.age); lili 3
        System.out.println("======="); 

        dog2.name="sisi";
        dog2.age=4;
        System.out.println(dog.name+" "+dog.age); sisi 4
        System.out.println(dog2.name+" "+dog2.age); sisi 4
        System.out.println("=======");

    }
}
class Dog{
    public  int age;
    public  String  name;

}

浅克隆解决引用复制问题

public class T18 {
    public static void main(String[] args) throws CloneNotSupportedException {
 
        Dog dog=new Dog();
        dog.name="lili";
        dog.age=3;
        Dog dog2= (Dog) dog.clone(); // invokevirtual #7                  // Method com/ms/Dog.clone:()Ljava/lang/Object;

        System.out.println(dog.name+" "+dog.age); lili 3
        System.out.println(dog2.name+" "+dog2.age); lili 3
        System.out.println("=======");

        dog2.name="sisi";
        dog2.age=4;
        System.out.println(dog.name+" "+dog.age); lili 3
        System.out.println(dog2.name+" "+dog2.age); sisi 4
        System.out.println("=======");

    }
}
class Dog implements  Cloneable{
    public  int age;
    public  String  name;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

 protected native Object clone() throws CloneNotSupportedException;

浅克隆不能解决对象里面的引用类型

package com.ms;

public class T18 {
    public static void main(String[] args) throws CloneNotSupportedException {

        Dog dog=new Dog();
        dog.name="lili";
        dog.age=3;
        DogChild dogChild=new DogChild();
        dogChild.name="xili";
        dog.dogChild=dogChild;

        Dog dog2= (Dog) dog.clone();
        System.out.println(dog.name+" "+dog.age+" "+dog.dogChild.name);
        System.out.println(dog2.name+" "+dog2.age+" "+dog2.dogChild.name);
        System.out.println("=======");

        dog2.name="sisi";
        dog2.age=4;
        dog2.dogChild.name="xisi";
        System.out.println(dog.name+" "+dog.age+" "+dog.dogChild.name);
        System.out.println(dog2.name+" "+dog2.age+" "+dog2.dogChild.name);
        System.out.println("=======");

    }
}
class Dog implements  Cloneable{
    public  int age;
    public  String  name;
    public  DogChild dogChild;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class DogChild {
    public String  name;
}

深克隆解决

  1. 序列化 (对象转化二进制流) serialVersionUID
private static final long serialVersionUID = -5902293609402731842L;

对不要序列化的属性使用 transient

public  transient  int age;

其他序列化方法

String s=JSON.toJSONString(dog);//序列化
Dog dog=(Dog)JSON.parseObject(s,Dog.class);//反序列化
Hessian方式序列化
ObjectOutputStream oo = new ObjectOutputStream(bo);
HessianOutput oo = new HessianOutput(bo);

序列化


import java.io.*;

public class T18 {
    public static void main(String[] args) {

        Dog dog=new Dog();
        dog.name="lili";
        dog.age=3;
        DogChild dogChild=new DogChild();
        dogChild.name="xili";
        dog.dogChild=dogChild;

        Dog dog2= CloneUtils.clone(dog);
        System.out.println(dog.name+" "+dog.age+" "+dog.dogChild.name);  //lili 3 xili
        System.out.println(dog2.name+" "+dog2.age+" "+dog2.dogChild.name);//lili 3 xili
        System.out.println("=======");

        dog2.name="sisi";
        dog2.age=4;
        dog2.dogChild.name="xisi";
        System.out.println(dog.name+" "+dog.age+" "+dog.dogChild.name);//lili 3 xili
        System.out.println(dog2.name+" "+dog2.age+" "+dog2.dogChild.name); //sisi 4 xisi
        System.out.println("======="); 

    }
}
class CloneUtils{
    public static <T extends Serializable> T clone(Dog obj) {
        T cloneObj = null;

        try {
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            ObjectOutputStream oo = new ObjectOutputStream(bo);
            oo.writeObject(obj);
            oo.close();

            ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
            ObjectInputStream oi = new ObjectInputStream(bi);
            cloneObj = (T) oi.readObject();
            oi.close();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return cloneObj;

    }

}
class Dog implements  Serializable{
    public  int age;
    public  String  name;
    public  DogChild dogChild;

}
class DogChild  implements  Serializable{
    public String  name;
}
  1. 所有引用类型都实现克隆
public class T18 {
    public static void main(String[] args) throws CloneNotSupportedException {

        Dog dog=new Dog();
        dog.name="lili";
        dog.age=3;
        DogChild dogChild=new DogChild();
        dogChild.name="xili";
        dog.dogChild=dogChild;

        Dog dog2= (Dog) dog.clone();
        System.out.println(dog.name+" "+dog.age+" "+dog.dogChild.name); //lili 3 xili
        System.out.println(dog2.name+" "+dog2.age+" "+dog2.dogChild.name); //lili 3 xili
        System.out.println("=======");

        dog2.name="sisi";
        dog2.age=4;
        dog2.dogChild.name="xisi";
        System.out.println(dog.name+" "+dog.age+" "+dog.dogChild.name);	//lili 3 xili
        System.out.println(dog2.name+" "+dog2.age+" "+dog2.dogChild.name); //sisi 4 xisi
        System.out.println("=======");

    }
}

class Dog implements  Cloneable{
    public  int age;
    public  String  name;
    public  DogChild dogChild;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Dog dog = (Dog) super.clone();
        dog.dogChild= (DogChild) dogChild.clone();
        return  dog;
    }
}
class DogChild  implements  Cloneable{
    public String  name;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值