克隆的好处
方便,性能高
引用复制问题
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;
}
深克隆解决
- 序列化 (对象转化二进制流) 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;
}
- 所有引用类型都实现克隆
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();
}
}