JAVA 对象拷贝

解决DevExpress汉化后不生效的5个常见问题及修复方法 本文详细解析了DevExpress汉化后不生效的5个常见问题及修复方法,包括汉化包部署位置验证、运行时缓存清除、权限与执行上下文排查、版本兼容性检测以及开发环境配置检查。通过实战案例和具体操作步骤,帮助开发者快速解决汉化失效问题,提升开发效率。 阅读详情

1.java里的clone分为: 
A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 
b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。 
Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点 
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。 
2.在派生类的clone()方法中,调用super.clone()。 
3.在派生类中实现Cloneable接口。 

Object类里的clone方法是浅复制(浅克隆) 

浅复制(浅克隆)的例子如下: 

public class CloneTest
{

	public static void main(String[] args) throws Exception
	{
		// teacher对象将被clone出来的Student对象共享.
		Teacher teacher = new Teacher();
		teacher.setAge(40);
		teacher.setName("Teacher zhang");

		Student student1 = new Student();
		student1.setAge(20);
		student1.setName("zhangsan");
		student1.setTeacher(teacher);

		// 复制出来一个对象student2
		Student student2 = (Student) student1.clone();
		System.out.println(student2.getAge());
		System.out.println(student2.getName());

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());

		// 修改student2的引用对象
		student2.getTeacher().setAge(50);
		student2.getTeacher().setName("Teacher Li");

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
	}
}

class Teacher
{
	public int age;
	public String name;

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public String getName()
	{
		return name;
	}

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

}

class Student implements Cloneable
{

	public int age;
	public String name;
	public Teacher teacher;

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public String getName()
	{
		return name;
	}

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

	public Teacher getTeacher()
	{
		return teacher;
	}

	public void setTeacher(Teacher teacher)
	{
		this.teacher = teacher;
	}

	@Override
	public Object clone() throws CloneNotSupportedException
	{
		return super.clone();
	}
}
输出结果为:
20
zhangsan
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang
~~~~~~~~~~~~~~~~~~~~~~
50
Teacher Li


2.深复制(深Clone)例子:

public class DeepCloneTest
{

	public static void main(String[] args) throws Exception
	{
		// teacher对象将不被clone出来的Student对象共享.
		Teacher teacher = new Teacher();
		teacher.setAge(40);
		teacher.setName("Teacher zhang");

		Student student1 = new Student();
		student1.setAge(20);
		student1.setName("zhangsan");
		student1.setTeacher(teacher);

		// 复制出来一个对象student2
		Student student2 = (Student) student1.clone();
		System.out.println(student2.getAge());
		System.out.println(student2.getName());

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());

		// 修改student2的引用对象
		student2.getTeacher().setAge(50);
		student2.getTeacher().setName("Teacher Li");

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
	}
}

class Teacher implements Cloneable
{
	public int age;
	public String name;

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public String getName()
	{
		return name;
	}

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

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

}

class Student implements Cloneable
{

	public int age;
	public String name;
	public Teacher teacher;

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public String getName()
	{
		return name;
	}

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

	public Teacher getTeacher()
	{
		return teacher;
	}

	public void setTeacher(Teacher teacher)
	{
		this.teacher = teacher;
	}

	@Override
	public Object clone() throws CloneNotSupportedException
	{
		Student student = (Student) super.clone();
		// 将引用的对象teacher也clone下
		student.setTeacher((Teacher) (student.getTeacher().clone()));
		return student;
	}
}

输出结果为:
20
zhangsan
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang

3.利用序列化来做深复制,把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization)过程。应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。,利用这个特性,可以做深拷贝 。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
//利用序列化来做深复制
//深clone

public class DeepCloneTest
{

	public static void main(String[] args) throws Exception
	{
		// teacher对象将不被clone出来的Student对象共享.
		Teacher teacher = new Teacher();
		teacher.setAge(40);
		teacher.setName("Teacher zhang");

		Student student1 = new Student();
		student1.setAge(20);
		student1.setName("zhangsan");
		student1.setTeacher(teacher);

		// 复制出来一个对象student2
		Student student2 = (Student) student1.deepCopy();
		System.out.println(student2.getAge());
		System.out.println(student2.getName());

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());

		// 修改student2的引用对象
		student2.getTeacher().setAge(50);
		student2.getTeacher().setName("Teacher Li");

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
	}
}

class Teacher implements Serializable
{

	private static final long serialVersionUID = -8834559347461591191L;

	public int age;
	public String name;

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public String getName()
	{
		return name;
	}

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

}

class Student implements Serializable
{

	// serialVersionUID
	// 如果你的对象序列化后存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你反序列化时,就会出现Exception的,这样就会造成不兼容性的问题。
	// 但当serialVersionUID相同时,它就会将不一样的field以type的缺省值赋值(如int型的是0,String型的是null等),这个可以避开不兼容性的问题。所以最好给serialVersionUID赋值
	private static final long serialVersionUID = 7991552226614088458L;

	public int age;
	public String name;
	public Teacher teacher;

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public String getName()
	{
		return name;
	}

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

	public Teacher getTeacher()
	{
		return teacher;
	}

	public void setTeacher(Teacher teacher)
	{
		this.teacher = teacher;
	}

	public Object deepCopy() throws Exception
	{
		// 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
		ByteArrayOutputStream bos = new ByteArrayOutputStream();

		ObjectOutputStream oos = new ObjectOutputStream(bos);

		oos.writeObject(this);

		// 将流序列化成对象
		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

		ObjectInputStream ois = new ObjectInputStream(bis);

		return ois.readObject();
	}
}

输出结果为:
20
zhangsan
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang


DeepCAD: 使用深度自监督学习技术在Python中进行钙成像去噪的全面指南 钙成像是一种用于观察神经活动的技术,通过检测细胞内钙离子的变化来推断神经元的活动。由于其高时空分辨率和对活体组织的适应性,钙成像已经成为神经科学研究中的重要工具。然而,钙成像数据往往伴随着各种噪声,这些噪声可能来自于设备、生物样本或环境。为了获得准确的神经活动信息,去噪是非常关键的。深度自监督学习是一种使用未标记数据进行训练的机器学习方法。与传统的监督学习不同,它不需要大量的标记数据,而是通过学习数据的内部结构和模式来提取有用的特征。DeepCAD是一个基于深度自监督学习的钙成像去噪工具。 阅读详情

相关推荐

LAMMPS实战:如何用ReaxFF力场模拟碳氢化合物热解(附完整脚本)

本文提供了一份使用LAMMPS软件中ReaxFF反应力场模拟碳氢化合物热解过程的完整实战指南。内容涵盖从环境准备、力场参数选择、能量最小化,到升温恒温动力学模拟的完整脚本编写,并介绍了基于轨迹文件的产物分析方法,帮助计算化学与材料科学研究者快速上手这一关键的分子动力学仿真技术。

soda5的博客 1091

如何使用BeanUtils+lombok复制对象

实操发现,仅引入 BeanUtils 是不够的,必须对象的类对每个成员变量具有 get() 和 set() 方法,否则无法给目标对象赋值。而应该 new 一个全新的对象,但是把其参数设置为与一个已有对象完全一样是困难的,因为对象的成员变量的个数可能很多,逐个去赋值是很低效的。两种工具的功能大致相同,都是 BeanUtils.copyproperties(obj1,obj2),但是区别在于前者的obj1是源,而后者obj1是目标。这样,首先就引入一个新的工具:BeanUtils,具体有两种。

Endless Encoding 3951

niushop靶场漏洞查找-文件上传漏洞等(超详细)

发现报错,而且这个报错十分熟悉,与我们所学的sqli报错注入特别像。这里查询到后面的url有且仅有一个,目测估计是后台。上传的图片是包含一句话木马的图片。发现获取到了webshell。实战漏洞-niushop。

qq_59020256的博客 1725

Java深克隆和浅克隆的原理及实现

通过上面的例子可以看到,浅拷贝会带来数据安全方面的隐患,例如我们只是想修改了 student 的 teacher,但是 student1 的 teacher 也被修改了,因为它们都是指向的同一个地址。可以通过hascode打印的值看的出来,引用类型的是相同内存地址,所以修改copy后中teacher.age,直接影响原来student中teacher对象的age。(2) 对于引用类型,比如数组或者类对象,深拷贝会新建一个对象空间,然后拷贝里面的内容,所以它们指向了不同的内存空间。

lvyuanj的专栏 1533

034、特定场景优化(一):小目标检测的改进策略合集

本文针对工业场景中的小目标检测难题,提出了一套实战优化方案。首先从数据层面建议保持高分辨率输入(1024-1280像素)或采用切块训练策略,并适当放大标注区域。在网络结构上,提出减少下采样次数、增加高分辨率检测头、引入空间注意力机制等改进。损失函数方面推荐使用NWD匹配和QFL损失提升小目标敏感度。部署环节强调NMS优化、分辨率对齐和量化处理技巧。最后总结核心经验:优先优化数据质量而非模型结构,标注一致性比算法更重要,同时需为实际部署预留性能余量。硬件升级有时比算法调优更经济有效。

xiaoyaohou11的博客 649

mipi deskew原理理解

何为skew, 从字面意思看是倾斜了,不对齐了;放在mipi的传输中意思就是clock lane和data lane 及data lane与data lane间出现了相位差;一旦出现相位差,大家采样数据时就可能不在同一个节拍上,会出现传输错误。所以就要做deskew,通过做deskew来使得大家重新对齐,在同一个节奏下传输数据. 一般当data rate高于1.5G时建议开启deskew。

lx123010的专栏 8089

对象拷贝初识mapstruct及与lombok的配置

java对象拷贝,MapStruct性能最高,原理类似于lombok,都是在编译期进行实现,而且基于Getter、Setter,,没有使用反射所以一般不存在运行时性能问题。

一个程序员的专栏 2406

手把手教你学Simulink--基础储能管理场景实例:基于Simulink的锂电池健康状态(SOH)在线评估仿真

本文详细介绍了基于Simulink的锂电池健康状态(SOH)在线评估仿真方法。主要内容包括:1)SOH定义与量化指标(容量SOH、内阻SOH及综合SOH);2)基于Thevenin模型参数辨识和递推最小二乘法(RLS)的在线评估原理;3)100次充放电循环的仿真场景设置;4)Simulink建模步骤(主电路搭建、核心模块实现及信号流连接);5)仿真结果分析,显示SOH评估误差<2%,响应时间45秒,满足在线评估需求;6)提出多参数融合评估、深度学习辅助辨识等优化方向。该方法为储能系统寿命管理提供了有效

MHD0815的博客 181

lombok使用总结

lombok学习使用笔记

weixin_52570681的博客 564

北斗导航 | SPP、RTK、RTD、PPP-RTK、PPP算法原理,公式及完整matlab代码

开发参考:SPP适合入门学习GNSS定位原理和最小二乘。RTK是工程高精度定位主流方案,但依赖基站。PPP适合无基站区域的广域高精度应用。PPP-RTK是融合两者优点的新一代技术,但系统复杂度最高。· 代码资源:raPPPid(VieVS PPP)是功能完整的MATLAB开源PPP工具箱,支持多系统PPP-AR。MATLAB GPS Toolbox 提供从SPP到PPP的完整功能实现。· 实际应用:农业自动驾驶、无人机航测通常使用网络RTK;大地测量、地壳形变监测常采用PPP事后处理;

尘世冰封的专栏 819

网络层隧道技术之ICMP隧道(pingTunnel/IcmpTunnel)

目录 ICMP隧道 使用ICMP搭建隧道(PingTunnel) 使用ICMP搭建隧道(Icmptunnel) ICMP隧道 ICMP隧道简单实用,是一个比较特殊的协议。在一般的通信协议里,如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要。最常见的ping命令就是利用的ICMP协议,攻击者可以利用命令行得到比回复更多的ICMP请求。在通常情况下,每个ping命令都有相...

谢公子的博客 6694

java引用拷贝,对象浅拷贝,对象深拷贝

JAVA对象拷贝分为两种方式,一种是引用拷贝,一种是对象拷贝 引用拷贝:和对象拷贝的不同之处在于,引用拷贝只会生成一个新的对象引用地址,但两个地址其最终指向的还是同一个对象; 对象拷贝:这种方式会重新生成一个新的对象,生成的新对象与原来的对象没有任何关联。 1、引用拷贝 引用拷贝也就是我们常用的对象赋值,这种方式不会生成新的对象,只会在原对象上增加了一个新的对象引用,两个引用指向的对象还是...

疯一样的女子 3933

MIMIC数据库简介

一 、MIMIC简介 MIMIC(Medical Information Mart for Intensive Care),是一个大型的公开数据库。该数据库记录了2001年至2019年期间贝斯以色列女狄肯斯医疗中心重症监护病房患者的相关数据,拥有4万多名患者的医疗健康数据和记录。 MIMIC数据库记录了人口统计学信息,如病人的性别、身高、宗教等情况。记录了实验室检验信息,如血常规,肝功能,肾功能等实验室检测数据。记录了患者的用药信息,如高血压患者服用了治疗高血压类药物等。记录了护理人员以及患者的护理级别等。

越努力 越幸运 1万+

java对象拷贝

java对象拷贝

2457

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java对象拷贝

1、clone(浅拷贝)会创建一个对象的副本,是native方法,效率高。 2、浅拷贝,如果原型对象的成员变量是值类型,将复制一份给拷贝对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给拷贝对象。原型对象和拷贝对象的引用类型变量指向相同的内存地址。 3、深拷贝,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给拷贝对象。 4、建议使用序列化的方式来实现对象的深拷贝。

weixin_40017062的博客 2706

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java中对象拷贝,对象的浅拷贝、对象的深拷贝

Java中对象的浅拷贝、深拷贝

下雨了亦留此地的博客 4358

Java对象拷贝以及常用对象拷贝工具

许久没有更新过,最近因为这个问题引发线上bug,特再次整理汇总!!! 文章目录1. 对象拷贝1.1 引用拷贝1.2 浅拷贝1.3 深拷贝2. 对象拷贝中常用的工具类2.1 Apache BeanUtils#copyProperties2.2 SpringUtils#copyProperties2.3 序列化(JSON)2.4 MapStruct(推荐) 1. 对象拷贝 Java语言中对象拷贝分为深拷贝和浅拷贝以及对象简单的引用拷贝(也就是通常使用的对象赋值)。 1.1 引用拷贝 引用拷贝即对象的赋值操作,就

Bobo‘s Home 1万+

java 对象拷贝_Java对象拷贝

Java对象拷贝分为浅拷贝(shadow copy )和深拷贝(deep copy)。浅拷贝:被复制对象的任何变量都含有和原来的对象相同的值,而任何的对其他对象的引用仍然指向原来的对象。对拷贝后的引用的修改,还能影响原来的对象。深拷贝:把要复制的对象所引用的对象都复制了一遍,对现在对象的修改不会影响原有的对象。首先,新建一个Employee类,包含一个String类型的姓名,一个double类型的...

weixin_42130786的博客 1473

java对象赋值、深拷贝与浅拷贝

Java 应用当中将一个对象的值给到一个新的对象可以通过直接赋值和拷贝的方式进行,但两种方式我们应该清除他们之间的区别; 直接赋值(引用赋值) 定义一个对象 public class User { private String name; private Integer age; private String sex; } 给新对象赋值并修改新对象: public static void main(String[] args){ User user1 = n

liutaiyi8的博客 8115

Java 对象属性拷贝总结

对象拷贝基础知识: Java中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。 对象拷贝分为浅拷贝(浅克隆)与深拷贝(深克隆)。 浅拷贝与深拷贝差异 分类 浅拷贝 深拷贝 区别 创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一

zhouzhiwengang的专栏 6521

Java中的对象拷贝

Java的对象拷贝是通过重写clone方法来实现的,具体使用时,你会发现有点奇怪。开发者首先需要为类实现Cloneable接口,然后重写clone方法。常见的代码如下:   class A implements Cloneable { public Object clone() { Object o = null; try { ...

义臻的博客 1960

java 对象拷贝,java拷贝对象

这是我个人的理解,加上以前看的一些帖子,有不对的地方,请高人指点。1.作为java参数传递给一个函数的对象,除了很简单的如int或者boolean等简单的以外,传递的都是这个对象的引用。当在接收函数中改变这个对象的时候,原来的对象即被改变。2.在初始化一个对象的时候,有时候我们希望用一个已经存在的对象来给另外一个对象赋值,但是直接用“=”给另外一个对象赋值的话,是错误的,这样会使两个不同的对象名字...

weixin_30284287的博客 189

Java中对象拷贝有哪些好用的工具类?

前言 由于在项目中经常需要使用到Java的对象拷贝和属性复制,如DTO、VO和数据库Entity之间的转换,因此本文对需要用到的相关方法、工具类做一个汇总,包括浅拷贝和深拷贝,方便在需要用到时作为参考。 浅拷贝(Shadow Copy) 手动复制 手动new对象,并设置相应字段的值,在字段较少时比较方便。另外就是由于是手动赋值,安全性较高,不容易出错,并且性能最好。 比如有如下一个类: public class User { private String name;

zybb166的博客 7147

java 对象拷贝_Java利器之对象拷贝

一、引言1.场景:当从后台接口中获取一个ResponseData时,除了将信息展示给用户看,因业务需要,有时ResponseData还需要在别的地方进行使用,这时候就需要对对象进行copy,来做相应的业务处理。为了简单起见,这里假设两个对象factory1 和 factory2 ,两者都是Factory类 的对象,有两个成员变量。public class Factory{int income;Wo...

weixin_34861702的博客 902

Java中对象拷贝的深度解析:从零拷贝到深拷贝的演进

浅拷贝和深拷贝在实现原理、特点和应用场景上有所不同。浅拷贝只复制对象本身和基本数据类型属性,而深拷贝则递归复制对象本身及所有引用类型的属性。浅拷贝速度快但存在数据共享的问题,而深拷贝则可以得到完全独立的对象但性能开销较大。在选择使用哪种拷贝方式时,需要根据具体的应用场景和需求来决定。

weixin_40381772的博客 1416

Java对象拷贝一文通

Java的浅拷贝与深拷贝。重点介绍了深拷贝的选择

啾啾头号大粉丝打工买粮博客 963
上一篇: JAVA 对象拷贝
下一篇: php简单分页类
jdluojing
博客等级 码龄17年 79粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值