zoukankan      html  css  js  c++  java
  • 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
    View Code

    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猪 地址:深圳
    View Code
  • 相关阅读:
    C#简单的工厂模式
    Microsoft.XMLHttp的属性和方法的简介及使用
    Google Earth 2007中文修订版
    偷懒秘笈之一键生成 Ajax Control Toolkit 标记 (转)
    C#获取硬盘序列号
    Google和百度、雅虎的站内搜索代码
    Visual Studio 2005 Team Suite 180 天试用版
    几种 Dotnet ORM 库的比较
    Windows Server 2003 SP2 0918 Personal 精简版
    通用水晶报表绑定类[原]
  • 原文地址:https://www.cnblogs.com/wy0904/p/7505585.html
Copyright © 2011-2022 走看看