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 】
相关推荐:
如何获取上海专业网站定制建站电话?
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
浅析上传头像示例及其注意事项
在线教育网站制作平台,山西立德教育官网?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
如何在建站宝盒中设置产品搜索功能?
googleplay官方入口在哪里_Google Play官方商店快速入口指南
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
如何在宝塔面板中修改默认建站目录?
Laravel模型事件有哪些_Laravel Model Event生命周期详解
iOS正则表达式验证手机号、邮箱、身份证号等
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel如何使用.env文件管理环境变量?(最佳实践)
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
如何确保西部建站助手FTP传输的安全性?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
如何用AWS免费套餐快速搭建高效网站?
Java解压缩zip - 解压缩多个文件或文件夹实例
如何快速搭建自助建站会员专属系统?
如何自定义建站之星模板颜色并下载新样式?
IOS倒计时设置UIButton标题title的抖动问题
JavaScript中的标签模板是什么_它如何扩展字符串功能
如何在阿里云通过域名搭建网站?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
如何快速搭建二级域名独立网站?
大同网页,大同瑞慈医院官网?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
高端企业智能建站程序:SEO优化与响应式模板定制开发
高端建站如何打造兼具美学与转化的品牌官网?
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
如何登录建站主机?访问步骤全解析
香港服务器租用费用高吗?如何避免常见误区?
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在建站主机中优化服务器配置?
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何用美橙互联一键搭建多站合一网站?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
轻松掌握MySQL函数中的last_insert_id()
C++用Dijkstra(迪杰斯特拉)算法求最短路径
再谈Python中的字符串与字符编码(推荐)
如何快速查询域名建站关键信息?

