java基础学习-克隆

用业务语义织就企业数据之网:SAP Datasphere 的定位、架构与落地场景全解析 SAP Datasphere作为SAP业务数据云的核心组件,通过语义层整合企业内外部数据,支持实时分析与AI应用。其核心功能包括数据集成、语义建模、虚拟化与仓库能力,通过Spaces实现资源隔离,Data Builder和Business Builder分别面向技术和业务建模。该平台与SAP HANA Cloud、SAC等深度集成,支持财务统一分析、供应链可视化等典型场景,并可通过BW bridge实现传统BW资产云化迁移。Datasphere强调开放互联,能与Databricks等生态伙伴协同,为企业提供 阅读详情

浅复制

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

深复制

被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍(递归下去)。

Java中对象的克隆

Object的clone()方法

clone方法将对象复制了一份并返回给调用者。
一般而言,clone()方法满足:
1)对任何的对象x,都有x.clone() !=x
克隆对象与原对象不是同一个对象
2)对任何的对象x,都有x.clone().getClass()= =x.getClass()
克隆对象与原对象的类型一样
3)如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。
实现:
1)为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
2)在派生类中覆盖基类的clone()方法,并声明为public(Object类中的clone()方法为protected的)
3)在派生类的clone()方法中,调用super.clone()
4)在派生类中实现Cloneable接口

浅复制

public class Student implements Cloneable {
	private int age;
	private String name;
	private Book book;

	public int getAge() {
		return age;
	}

	public Book getBook() {
		return book;
	}

	public void setBook(Book book) {
		this.book = book;
	}

	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 {
		Object object = super.clone();
		return object;
	}

}
public class Book {
	
	public String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
public class Test {
	public static void main(String[] args) throws CloneNotSupportedException {
		Student student1 = new Student();
		Book book = new Book();
		book.setName("english");
		student1.setName("zhangsan");
		student1.setAge(22);
		student1.setBook(book);
		Student student2 = (Student) student1.clone();
		System.out.println(student1.clone().equals(student1));// false
		System.out.println(student1.clone() == student1);// false
		System.out.println(student1.clone().getClass() == student2.getClass());// true
		System.out.println(student2.getName());// zhangsan
		student1.setName("lisi");
		student1.getBook().setName("chinese");
		System.out.println(student2.getName());// zhangsan
		System.out.println(student2.getBook().getName());// chinese
	}
}

深复制

方式一:利用clone方法
public class Fruit implements Cloneable {

	public String name;

	public Apple apple;

	public String getName() {
		return name;
	}

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

	public Apple getApple() {
		return apple;
	}

	public void setApple(Apple apple) {
		this.apple = apple;
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		<strong>Fruit fruit1 = (Fruit) super.clone();
		fruit1.setApple((Apple) fruit1.getApple().clone());
		return fruit1;</strong>
	}
}
public class Apple  implements Cloneable {

	public String Name = "";

	public String getName() {
		return Name;
	}

	public void setName(String name) {
		Name = name;
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		<strong>return super.clone();</strong>
	}
}

public class Test {
	public static void main(String[] args) throws Exception {

		Fruit fruit1 = new Fruit();
		Apple apple = new Apple();
		fruit1.setName("apple");
		apple.setName("fusi");
		fruit1.setApple(apple);
		Fruit fruit2 = (Fruit) fruit1.clone();
		System.out.println(fruit1.clone().equals(fruit1));// false
		System.out.println(fruit1.clone() == fruit1);// false
		System.out.println(fruit1.clone().getClass() == fruit2.getClass());// true
		System.out.println(fruit2.getName());// apple
		fruit1.setName("banana");
		fruit1.getApple().setName("shandong");
		System.out.println(fruit2.getName());// apple
		System.out.println(fruit2.getApple().getName());// fusi
		
	}
}

方式二:序列化方式
public class People  implements Serializable {

	public String name;
	
	public Girl girl;

	public String getName() {
		return name;
	}

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

	public Girl getGirl() {
		return girl;
	}

	public void setGirl(Girl girl) {
		this.girl = girl;
	}
	
	public Object deepCopy() throws Exception{
		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();
	}
}
public class Girl  implements Serializable {

	public String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}
public class Test {
	public static void main(String[] args) throws Exception {
		
		People people1 = new People();
		Girl girl = new Girl();
		people1.setName("zhangsan");
		girl.setName("meimei");
		people1.setGirl(girl);
		People people2 = (People) people1.deepCopy();
		System.out.println(people1.deepCopy().equals(people1));// false
		System.out.println(people1.deepCopy() == people1);// false
		System.out.println(people1.deepCopy().getClass() == people2.getClass());// true
		System.out.println(people2.getName());// zhangsan
		people1.setName("lisi");
		people1.getGirl().setName("lili");
		System.out.println(people2.getName());// zhangsan
		System.out.println(people2.getGirl().getName());// meimei
	}
}






Java与OSG的梦幻联动:深入编译OpenSceneGraph的Java JNI桥梁,开启3D视觉盛宴的奇幻之旅 🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀在编译OpenSceneGraph (OSG) 的Java版本时,首先需要了解OSG本身是一个主要用于3D图形和视觉仿真的开源库,它主要支持C++。然而,OSG 也支持通过JNI(Java Native Interface)与Java集成,这允许Java程序调用OSG的C++库。 阅读详情

相关推荐

Balser相机的硬件触发实战:从连线到信号处理

本文详细介绍了Balser相机硬件触发的实战应用,从硬件接线、信号定义到软件配置(Pylon Viewer及API)提供了完整指南。重点阐述了如何利用外部物理电信号实现微秒级精准触发,解决工业场景下的同步与延迟问题,并分享了信号调理、抗干扰等高级实战经验。

y9z0a1b的博客 338

java基础入门学习08-浅克隆,深克隆

首先我们明白对于非基础数据类型,我们在创造对象的时候会在堆中存储对象的具体信息,这个时候就需要知道对象的地址,然后调用的时候根据地址找到对象的具体信息,而浅克隆就是在克隆数据后,并不会克隆堆中对象的具体信息,而是克隆出来的对象跟克隆本体两个在调用对象时指向同一个地址,而深克隆则是在堆中克隆一个新的对象,然后指向新克隆出来堆中对象的地址。克隆就是根据已有的数据,创造一份完全一样的数据拷贝。深刻隆需要对引用对象再次克隆。

m0_74345597的博客 222

量子阱技术解析:从基础原理到前沿应用

本文深入解析量子阱技术,从微观“能量游泳池”的基础原理出发,阐释了其通过限制电子实现能级量子化,从而精确调控发光波长的核心机制。文章详细探讨了量子阱在半导体激光器和LED中的革命性应用,如实现低阈值电流与高亮度显示,并展望了其在能带工程及量子级联激光器等前沿领域的发展与挑战。

weixin_29267307的博客 282

Java基础学习 —— 对象的克隆

对象的克隆分为对象的浅克隆和深克隆 一、对象的浅克隆 注意事项: 1.如果一个对象需要调用clone的方法克隆,那么该对象必须要实现Cloneable接口 2.Cloneable对象只是一个标识对象,并没有方法 1 public class demo1 { 2 public static void main(String[] args) throws Except...

weixin_30443813的博客 96

因果表示学习 (Causal Representation Learning, CRL)

传统的机器学习,尤其是深度学习,非常擅长学习数据中的相关性 (Correlation)。但它常常会走“捷径”,学到一些虚假的、不稳定的“表面联系”。一个AI模型在学习识别“牛”时,如果训练数据里所有的牛都在绿色的草地上,模型很可能会学到一个错误的规则:“牛 = 四条腿的生物 + 绿色背景”。你给它一张牛在海滩上的照片,它就可能不认识了。因果表示学习的目标,就是让模型超越这种表面相关性,去学习数据背后。

Xuxiansir的博客 1182

EndNote20保姆级安装教程:从下载到汉化一步到位(附闪退解决方案)

本文提供EndNote20的详细安装与汉化教程,涵盖系统准备、分步安装、路径优化及闪退解决方案。针对科研人员的需求,特别优化了中文环境下的使用体验,确保文献管理工具的高效稳定运行。

weixin_30415113的博客 342

零基础入门学习java第十四节:Java对象的克隆

零基础入门学习java第十四节:Java对象的克隆 今天要介绍一个概念,对象的克隆。本篇有一定难度,请先做好心理准备。看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充。 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢?什么时候需要使用呢?先来看一个小栗子: 简单起见,我们这里用的是Goods类的简单版本。 public class Goods {...

tzllxya的博客 199

从 SOAUTH2 到系统用户,SAP AS ABAP 里配置 OAuth 2.0 Client 的完整落地思路

SAP OAuth 2.0客户端配置的核心在于建立系统级信任关系。在AS ABAP中,每个OAuth 2.0客户端必须关联一个System类型的用户账号(通过SU01创建),并建议采用业务语义明确的命名规范(如ZBTP_PO_APPROVAL_APP)。关键配置包括:客户端认证方式(推荐SSL证书而非共享密钥)、Token生命周期(默认3600秒)、Scope访问范围,以及根据应用场景选择Authorization Code或SAML 2.0 Bearer等授权模式。项目实践中应避免混合配置不同授权类型,而

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 988

面试题:深克隆和浅克隆的实现方式,7年老Java一次坑爹的面试经历

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2401_84103616的博客 782

四足狗机器人硬件开发技术栈详解

本文系统介绍了四足狗机器人的硬件开发技术,重点分析了五大核心模块:机械结构(骨架设计)、动力系统(关节驱动)、感知系统(环境监测)、控制系统(决策中枢)和电源系统(能源管理)。文章详细阐述了各模块的选型标准、技术要点和协同设计原则,提供了从需求定位到组装调试的完整开发流程,并针对常见问题给出解决方案。随着材料轻量化、模块标准化和AI集成化的发展趋势,四足机器人硬件将向更灵活、更智能的方向演进,为工业巡检、应急救援等场景提供更强大的移动平台支持。

start_up_go的博客 284

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

03-Linux系统克隆和快照

简介虚拟机克隆分为“完整克隆”(Full Clone)和“链接克隆”(Linked Clone)两种方式。克隆过程中,VMware会生成和原始虚拟机不同的MAC地址和UUID,这就允许克隆的虚拟机和原始虚拟机在同一网络中出现,并且不会产生任何冲突。例如:完整克隆完全克隆(Full Clone)的虚拟机不依赖源虚拟机,是完全独立的虚拟机,它的性能与被克隆虚拟机相同。由于完整克隆不与父虚拟机共享虚拟磁盘,所以创建完整克隆所需的时间比链接克隆更长。如果涉及的文件较大,完整克隆可能需要数分钟才能创建完成。

2401_84408418的博客 796

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java基础学习部分知识总结

java基础部分知识总结

qq_58317991的博客 253

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java学习之克隆

克隆概念以及深克隆与浅克隆

2301_81288466的博客 1583

【Java基础】对象深克隆和浅克隆的原理及实现

彻底理解Java深克隆和浅克隆的原理及实现 Java 面试:对象克隆 如何拷贝对象 深入浅出 Java 中的 clone 克隆方法 java实现克隆的三种(很最全面) 深浅克隆区别 克隆实现方式 深克隆与浅克隆 JAVA clone方法-深复制(深克隆)&浅复制(浅克隆) Java对象克隆——浅克隆和深克隆的区别 Java深克隆和浅克隆的原理及实现 为什么要对象克隆? 克隆的对象可能包含一...

墩墩分墩 2465

【Java】浅克隆、深克隆

步骤如下1、重写Object中的clone()方法2、让JavaBean类实现Cloneable接口3、创建原对象并调用clone()即可在Java中有两种克隆方式:浅克隆 和 深克隆浅克隆:不管对象内部的属性是基本数据类型还是引用数据类型,它都会完全拷贝过来深克隆:如果是基本数据类型,它会把记录的值拷贝过来;如果是字符串,那么它会复用串池中的;如果是除字符串外的引用数据类型,它就会创建新的小空间。而在我们之前讲的Object中的clone()方法属于浅克隆。

qq_39921135的博客 1500

Java浅克隆与深克隆

通常我们想复制一个对象,可以自己new出一个对象,并对相应的属性存入数据以实现克隆的目的。可是当属性较多时,这样的方式会十分麻烦。然而Java早已考虑好一切,我们知道,所有的对象都有一个共同的父类Object,而Object类中已经定义好了protected修饰的clone()方法,今天我们从这个方法开始,讲述Java的浅克隆与深克隆。 浅克隆与深克隆的区别 **浅克隆:**复制对象时仅仅复制对象...

学习即修行 6万+

【JAVA学习第三期】克隆的几种方式

在Java程序开发中,想要得到数据对象一模一样的对象,对其中任何一个对象的更改都不会影响另一个对象,这时我们就需要克隆的方式来创建对象。首先,了解一下什么是克隆,为什么要用克隆?...

wangboluo123的博客 1526

【Java基础】深克隆浅克隆

浅谈Java中的深克隆和浅克隆、深克隆和浅克隆的区别和实现方式? 克隆(复制)在Java中是一种常见的操作,目的是快速获取一个对象副本。克隆分为深克隆和浅克隆。 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。 总之,深浅克隆都会在堆中新分配一块区域,区别在于对象属性引用的对象是否需要进行克隆(递归性的)。 Show you my picture# pos:当前对

Johnny_sc的博客 380

Java对象的浅克隆和深克隆

为什么需要克隆      在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的,要满足这种需求有很多途径。       克隆的实现方式

caomiao2006的专栏 9894

【Java基础之Clone】浅克隆与深克隆详解

在Java 中 clone 方法是 Object 类中的一个方法,Object 类又是所有类的父类,因此所有的类都可以继承 clone 方法,clone 时分为浅克隆和深克隆,首先需要了解什么是浅克隆,什么是深克隆。

looper梦呓 887

java 克隆有什么用_Java学习笔记:为什么要使用克隆,如何实现?

1.为什么要使用克隆?想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了。克隆分浅克隆和深克隆,浅克隆后的对象中非基本对象和原对象指向同一块内存,因此对这些非基本对象的修改会同时更改克隆前后的对象。深克隆可以实现完全的克隆,可以用反射的方式或序列化的方式实现。2.如何实现?(转载:https://www.cnblogs.com/wanghx-0713/p/7879913.htm...

weixin_31558841的博客 2695

Java基础篇-深克隆与浅克隆从了解到实操该如何避坑

本文主要是针对深克隆和浅克隆展开论述,从概念到实操以及如何避坑提供了相关案例,从而加深理解与应用

小宝潜行的博客 1144

Java基础之浅克隆和深克隆

在我们的日常开发中可能会暂时需要保存某个对象的拷贝,如果new一个新对象再把值一个一个set进去也不是不可以,但总感觉很蠢,所以Java为我们提供了clone方法,使用这个方法拷贝也就是我们要提到的浅克隆了。 浅克隆 浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。 浅克隆要求克隆的类必须实现Cloneable接口,Cloneable接口与Se...

博客 203

Java克隆

Java克隆

qingyue1111的博客 1262

java深克隆使用场景_java基础——浅克隆与深克隆

为什么使用clone存在一个对象A,A已有初始值,这时候可能需要一个新的对象B和A相同,但是A和B是两个独立的对象,任意一个改动都不影响其中一个的值,但是B的初始值由A确定,这时候clone就是最有效也是最简单的方法。new一个对象和clone一个对象的区别new操作符的本意是分配内存空间,java程序执行到new操作符时,首先去看new操作符后面的类型,知道类型才能知道需要分配多大的内存空间,分...

weixin_28706541的博客 600

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 292
上一篇: java基础学习-集合
下一篇: java基础学习-注解
巴狼
博客等级 码龄12年 0粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值