Java基础学习 —— 对象的克隆
对象的克隆分为对象的浅克隆和深克隆
一、对象的浅克隆
注意事项:
1.如果一个对象需要调用clone的方法克隆,那么该对象必须要实现Cloneable接口
2.Cloneable对象只是一个标识对象,并没有方法
1 public class demo1 { 2 public static void main(String[] args) throws Exception { 3 Person person = new Person("001","狗娃"); 4 Person person2 = person.clone(); 5 person2.setName("abd"); 6 System.out.println(person.toString()); 7 System.out.println(person2.toString()); 8 } 9 }
输出结果?
编号:001姓名:狗娃
编号:001姓名:abd
3.对象的浅克隆,在克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆一个对象的地址而没有把另外一个对象也克隆一份。
如图所示,对象的浅克隆只是克隆了address对象的地址,这样我们修改p2对象的时候,会将其内存地址的内容一并修改,所以输出city结果是一样的。
4.对象的浅克隆,也不会调用到构造方法的。
二、对象的深克隆
对象的深克隆:对象的深克隆,就是利用了对象的输入输出流,把对象先写到文件里,然后再读取对象的信息,这个过程称为对象的深克隆。
1 public class demo2 { 2 public static void main(String[] args) throws IOException, ClassNotFoundException { 3 Adress adress = new Adress("北京"); 4 Person person = new Person("002","sony猪",adress); 5 writObj(person); 6 Person person2 = readObj(person); 7 person2.adress.city = "深圳"; 8 System.out.println("person1:"+person.toString()); 9 System.out.println("person2:"+person2.toString()); 10 } 11 public static Person readObj(Person person) throws IOException, ClassNotFoundException{ 12 FileInputStream fileInputStream = new FileInputStream("E:\\obj.txt"); 13 ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 14 return (Person) objectInputStream.readObject(); 15 } 16 public static void writObj(Person person) throws IOException{ 17 //建立文件的输出流对像 18 FileOutputStream fileOutputStream = new FileOutputStream("E:\\obj.txt"); 19 ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 20 objectOutputStream.writeObject(person); 21 objectOutputStream.close(); 22 } 23 }
输出结果?
person1:编号:002姓名:sony猪 地址:北京
person2:编号:002姓名:sony猪 地址:深圳