对象的深浅克隆

1、

package cn.itcast.copy;
/*
 对象的克隆

     对象的浅克隆:

     对象浅克隆要注意的细节:
         1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
         2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
         3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把
         另外一个对象也克隆一份。
         4. 对象的浅克隆也不会调用到构造方法的。

     对象的深克隆:

 */
public class Demo1 {

    public static void main(String[] args) throws Exception {
        Address address = new Address("广州");
        Person p1 = new Person(110,"狗娃",address);
        Person p2 = (Person) p1.clone(); //clone() 克隆了一个对象。

        p2.name = "狗剩";
        p2.address.city ="长沙";
        System.out.println("p1:"+p1);//长沙
        System.out.println("p2:"+ p2);//长沙
} }

2、

/*
对象的深克隆: 对象的深克隆就是利用对象的输入输出流把对象先写到文件上,然后再读取对象的
信息这个过程就称作为对象的深克隆。

    ObjectInputStream
    ObjectOutputStream 

 */
public class Demo2 {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Address address = new Address("广州");
        Person p1 = new Person(110,"狗娃",address);
        writeObj(p1);
        Person p2  =readObj();

        p2.address.city = "长沙";
        System.out.println("p1:"+ p1);//广州
        System.out.println("p2:"+ p2);//长沙
} //再从文件中读取对象的信息 public static Person readObj() throws ClassNotFoundException, IOException{ FileInputStream fileInputStream = new FileInputStream("F:\\obj.txt"); //创建对象的输入流对象 ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); return (Person) objectInputStream.readObject(); } //先要把对象写到文件上。 public static void writeObj(Person p) throws IOException{ //建立一个文件 的输出流对象 FileOutputStream fileOutputStream = new FileOutputStream("F:\\obj.txt"); //建立对象的输出流 ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); //把对象写出  objectOutputStream.writeObject(p); //关闭资源  objectOutputStream.close(); } }

3、person类

package cn.itcast.copy;

import java.io.Serializable;

class Address implements Serializable{

    String city;

    public Address(String city){
        this.city = city;
    }

}

public class Person implements Cloneable,Serializable {

    int id;

    String name;

    Address address;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;

    }

    public Person(int id, String name, Address address) {
        this.id = id;
        this.name = name;
        this.address = address;
        System.out.println("=======构造方法调用了===");
    }

    @Override
    public String toString() {
        return "编号:"+ this.id+" 姓名:"+ this.name+" 地址:"+ address.city;
    }

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

}
时间: 2025-01-15 05:32:30

对象的深浅克隆的相关文章

java对象的深浅克隆

package CloneTest; class Dog implements Cloneable{ private String dname; private Integer dage; public Dog clone() throws CloneNotSupportedException{  Dog cloned=(Dog) super.clone();  return cloned;   } public String getDname() {  return dname; } publ

Java中对象的深浅克隆之序列化篇

浅复制与深复制的区别浅复制:被复制对象的所有变量都含有与原有对象相同的value而所有的对其他对象引用仍然指向原来对象.浅复制仅仅复制对象而没有复制其引用的对象常见例子 List<Map<String,String>> list1 = new ArrayList<Map<String, String>>(); Map<String,String> map = new HashMap<String, String>(); map.put

JavaScript实现对象的深度克隆【简洁】【分享】

JavaScript实现对象的深度克隆 代码实现如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>clone</title> 6 7 <script type="text/javascript"> 8 //对象深度克隆方法 9 10 11 ////

php类和对象: clone 克隆

对象也能被“克隆” 在php5中,对象的传递方式默认为引用传递,如果我们想要在内存中生成两个一样的对象或者创建一个对象的副本,这时可以使用“克隆”. 通过 clone 克隆一个对象 对象的复制是通过关键字 clone 来实现的.用 clone 克隆出来的对象与原对象没有任何关系,它是把原来的对象从当前的位置重新复制了一份,也就是相当于在内存中新开辟了一块空间.通过关键字 clone 可以克隆一个对象,语法格式如下: $克隆对象名称=clone $原对象名称; __clone()方法 对象的__c

javascript中对象的深度克隆

零.寒暄 又是一个月多月没有更新博客了,这段时间回学校处理下论文的事情,实习的生活也暂时告一段落(在公司上班,才发现学校里面的生活简直如天堂一般,相信很多已经毕业的小伙伴肯定被我说中了,说中了请给本文点个赞,哈哈!).希望接下来自己的更新进度能加快,马上又是一年校招时,被虐也好.大牛虐别人也罢,总之祝福各位今年要找工作的小伙伴们好运.那么,今天就聊一下一个常见的笔试.面试题,js中对象的深度克隆.翻了下这个题目,在很多地方出现过,已经算一个老的题目了,但是每年的校招中总会考到,其实想想,这个题目

JAVA对象任意深度克隆clone工具类分享

原文:JAVA对象任意深度克隆clone工具类分享 源代码下载地址:http://www.zuidaima.com/share/1550463408114688.htm package com.zuidaima.n_app.util; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import jav

Php面向对象学习笔记 – 构造、析构、对象赋值、克隆

Php面向对象学习笔记 – 构造.析构.对象赋值.克隆 class student { public  $stu_id;       // 定义成员变量 public  $stu_name; public  function sayName()   // 成员函数 { echo $this->stu_name;   // $this  访问该对象的成员变量 } } $stu = new  Student;      // 创建对象 $stu->stu_id = '0607001'; $stu-

js通过一个方法实现对象的深浅拷贝。

众所周知,对象的深浅拷贝是工作中肯定会遇到的问题.所以,今天考虑写个小的功能来记录一下 //type:boolean,true-deep,true为深拷贝, function extendCopy(type,item){ if(typeof type != "boolean" || typeof item !='object'){ return } var newObj = item.constructor ==="Array" ?[]:{}; if(type){

JAVA对象的深度克隆

有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只对了一半,因为用clone()时,除了基础数据和String类型的不受影响外,其他复杂类型(如集合.对象等)还是会受到影响的!除非你对每个对象里的复杂类型又进行了clone(),但是如果一个对象的层次非常深,那么clone()起来非常复杂,还有可能出现遗漏! 既然用等号和clone()复制对象都会对