java 对象的克隆(浅克隆和深克隆)

发布时间 - 2026-01-11 02:27:02    点击率:

java 对象的克隆

一、对象的浅克隆

(1)需要克隆类需要重写Object类的clone方法,并且实现Cloneable接口(标识接口,无需实现任何方法)
(2)当需要克隆的对象中维护着另外一个引用对象,浅克隆不会克隆另外一个引用对下,而是直接复制维护的另外一个引用对象的地址。
(3)对象的浅克隆也不会调用到构造方法。

以下为对象的浅克隆的一个例子:

package com.clone;

import java.io.Serializable;

/**
 * Description:
 * 实现了Cloneable接口,并重写Object类的clone方法。
 * 
 * @author lee
 * */
public class CloneDemo1 implements Cloneable,Serializable{

  //该克隆类封装的信息
  public int id;
  public String name;
  public Address address;

  /**
   * Desciption:
   * 默认构造器
   * 
   * */
  public CloneDemo1(){}

  /**
   * Description:
   * 初始化id,name的构造器
   * 
   * @param id id
   * @param name 名字
   * @param address 地址
   * */
  public CloneDemo1(int id, String name, Address address){
    this.id=id;
    this.name=name;
    this.address = address;
  }

  /**
   * Descriptin:
   * 重写Object类的clone方法。
   * if the object's class does not support the Cloneable interface.
   * Subclasses that override the clone method can also throw this exception 
   * to indicate that an instance cannot be cloned.
   * 
   * @throws CloneNotSupportedException 
   * */
  @Override
  public Object clone() throws CloneNotSupportedException{
    return super.clone();
  }

  /**
   * Description:
   * 重写toString方法
   * 
   * @return "id="+id+", name="+name
   * */
  @Override
  public String toString(){
    return "id="+id+", name="+name+", address:"+address.getAddress();
  }

  /**
   * Description:
   * 主方法
   * 
   * */
  public static void main(String[] args) throws CloneNotSupportedException{

    CloneDemo1 c1 = new CloneDemo1(1,"c1",new Address("北京"));
    //c2 复制了c1的地址,并没有复制整个c1对象
    CloneDemo1 c2 = c1;
    //c3 对象的浅克隆,复制了整个对象
    CloneDemo1 c3 = (CloneDemo1)c1.clone();

    //当对象c1改变其name或者id的时候,c2也会自动改变。
    //因为c2只是复制了c1的地址,并非复制了c1的整个对象。
    //相应的c3则不会随着c1改变而改变,意味着c3将c1整个对象克隆一份出来。

    //当是,对象的浅克隆不会克隆被克隆对象当中的引用对象。
    //因此c1改变其中的Address的引用对象时,c2,c3也会跟着改变。
    c1.setName("cc");
    c1.address.setAddress("上海");
    System.out.println(c1+"\n"+c2+"\n"+c3);



  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

}

/**
 * Description:
 * 一个封装着地址的类
 * 
 * @author lee
 * */
class Address implements Serializable{
  public String address;

  /**
   * Description:
   * 默认构造器
   * 
   * */
  public Address(){}

  /**
   * Description:
   * 初试化address
   * 
   * @param address 地址
   * */
  public Address(String address){
    this.address = address;
  }

  //address的set和get方法
  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }
}

二、对象的深克隆

就是利用对象的输入输出流把对象写到文件上,再读取对象的信息,这就是对象的深克隆。

由于对象的浅克隆不会克隆被克隆对象其中的引用对象,而是直接复制其地址。因此,要克隆被克隆对象当中的引用类型则需要对象的深克隆。

而对象的深克隆使用的的对象序列化输入输出。

代码如下:

package com.clone;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * Description:
 * 实现对象的深克隆
 * 
 * @author lee
 * */
public class CloneDemo2 {

  /**
   * Description:
   * 将对象输出到一个文件当中。
   * 
   * @param c 需要被写到文件当中的对象。
   * */
  public static void writeObject(CloneDemo1 c){

    ObjectOutputStream out = null;
    try{

      //将对象输出在一个object.txt文件当中
      out = new ObjectOutputStream(new FileOutputStream("./object.txt"));
      out.writeObject(c);

    }catch(IOException e){
      System.out.println("写入对象的时候发生了错误。");
      e.printStackTrace();
    }finally{

      //关闭资源
      try{
        out.close();
      }catch(IOException e){
        e.printStackTrace();
      }
    }


  }

  /**
   * Description:
   * 从文件中读取出一个对象来,并返回。
   * 
   * @return c 返回一个对象。
   * */
  public static CloneDemo1 readObject(){

    CloneDemo1 c = null;
    ObjectInputStream input = null;
    try{
      //从object.txt文件中读取一个对象出来
      input = new ObjectInputStream(new FileInputStream("./object.txt"));
      c = (CloneDemo1)input.readObject();

    }catch(IOException | ClassNotFoundException e){
      e.printStackTrace();
      System.out.println("读取对象的时候发生了错误。");
    }finally{
      //关闭资源
      try{
        input.close();
      }catch(IOException e){
        e.printStackTrace();
      }
    }
    return c;
  }
  /**
   * Description:
   * 主方法
   * 
   * @throws CloneNotSupportedException 
   * */
  public static void main(String[] args) throws CloneNotSupportedException {
    CloneDemo1 c1 = new CloneDemo1(1,"c1",new Address("北京"));
    //c2 对象的浅克隆
    CloneDemo1 c2 = (CloneDemo1)c1.clone();
    //c3对象的深克隆
    writeObject(c1);
    CloneDemo1 c3 = readObject();

    //因为对象的深克隆同时也克隆了被克隆对象维护的另外一个对象
    //所以,当c1改变其当中的维护的另外一个对象的时候,c3不会随之改变。
    //而c2位浅克隆,其维护的另外一个对象只是复制了c1维护的对象的地址,因此会随着c1的改变而改变。
    c1.address.setAddress("上海");
    System.out.println(c1+"\n"+c2+"\n"+c3);

  }

}

对象的序列化,是需要实现Serializable接口的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # 对象的克隆  # 对象克隆(浅克隆和深克隆)  # Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍  # 基于序列化存取实现java对象深度克隆的方法详解  # 深入JAVA对象深度克隆的详解  # Java编程实现对象克隆(复制)代码详解  # Java中对象的序列化方式克隆详解  # JAVA 对象创建与对象克隆  # 实例分析java对象中浅克隆和深克隆  # 深入了解Java对象的克隆  # java对象克隆实现方法详解  # 另外一个  # 重写  # 也会  # 写到  # 上海  # 北京  # 发生了  # 序列化  # 这就是  # 希望能  # 要对  # 谢谢大家  # 装着  # 则需  # 象中  # 再读  # 实现了  # Desciption  # param  # String 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网页设计与网站制作内容,怎样注册网站?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  linux top下的 minerd 木马清除方法  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  如何正确下载安装西数主机建站助手?  JavaScript如何实现音频处理_Web Audio API如何工作?  如何在万网自助建站平台快速创建网站?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  使用豆包 AI 辅助进行简单网页 HTML 结构设计  如何自定义建站之星模板颜色并下载新样式?  如何制作一个表白网站视频,关于勇敢表白的小标题?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Laravel如何使用Vite进行前端资源打包?(配置示例)  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Laravel如何实现多对多模型关联?(Eloquent教程)  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何快速搭建高效服务器建站系统?  nodejs redis 发布订阅机制封装实现方法及实例代码  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  如何快速搭建二级域名独立网站?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel如何处理文件下载请求?(Response示例)  如何用狗爹虚拟主机快速搭建网站?  在centOS 7安装mysql 5.7的详细教程  韩国服务器如何优化跨境访问实现高效连接?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel如何处理表单验证?(Requests代码示例)  如何在Windows虚拟主机上快速搭建网站?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel如何使用Blade模板引擎?(完整语法和示例)  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  JavaScript数据类型有哪些_如何准确判断一个变量的类型  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何快速打造个性化非模板自助建站?  海南网站制作公司有哪些,海口网是哪家的?  Laravel怎么判断请求类型_Laravel Request isMethod用法  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID