java的克隆主要分为浅克隆和深克隆两种,接下来分别介绍一下这两种克隆
浅克隆接下来克隆一个person对象
需要注意,在Person类里有一个Brain类,将Person类克隆一份
public class Person implements Cloneable{ Brain b; public Person(Brain b) { super(); this.b = b; } public static void main(String[] args) throws CloneNotSupportedException { Brain b=new Brain(); Person p=new Person(b); Person p2 = (Person) p.clone(); //比较两个对象的地址和脑子这个对象的地址 System.out.println(p==p2); System.out.println(p.b==p2.b); 结果:false浅克隆 true 通过结果可以发现克隆出来的p2是不同的,但是P2里的Brain对象没有被克隆过来 } }
重点
1:浅克隆需要去实现cloneable类,这个类没有任何东西,是个标记性类
2:浅克隆是通过object类里自带的方法进行克隆的
3:克隆出来的对象,对象时克隆过来的,但对象里面的对象没有被克隆过来
深克隆没有使用object里的方法,而是使用的流的方式,将对象写进一个文件里,然后在文件中写出来,完成克隆
主要用到ObjectInputStreamObjectOutputStream两个类,并且需要实现serializable接口
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Person implements Serializable{ private static final long serialVersionUID = 1L; Brain b; public Person(Brain b) { super(); this.b = b; } public static void main(String[] args) throws Exception { Brain b=new Brain(); Person p=new Person(b); //将文件写入对象中 ObjectOutputStream oop=new ObjectOutputStream(new FileOutputStream(new File("person.abc"))); oop.writeObject(p); //将文件里的对象读出来(克隆一份) ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("person.abc"))); Person p2 = (Person) ois.readObject(); System.out.println(p==p2); System.out.println(p.b==p2.b); } } 结果:false false 可以看出来,不仅Person对象克隆了,Person里的Brain对象也克隆了一份
重点:
1:深克隆需要实现Serializable接口
2:深克隆使用的流的方式,将文件写进文件,当克隆的时候写出来
3:实现Serializable需要添加一个序列化序号,只有当序列化一致,才可以克隆
4:克隆出来的对象,对象时克隆过来的,对象里面的对象也被克隆过来
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)