java基础学习-克隆

白话讲解帕累托前沿点(Pareto Frontier)基础知识与实例解析 排除所有“劣解”,缩小决策范围;量化目标间的“权衡关系”(如“每增加1千元成本,续航提升多少小时”);支持不同场景下的个性化选择,平衡冲突目标。无论是手机选购、汽车设计,还是城市规划,帕累托前沿都是从“混乱的多目标”到“清晰的权衡”的关键桥梁,是现代决策科学中不可或缺的工具。通过数学建模,工程很多问题都可以建模成帕累托前沿求解问题,通过线性规划CPLEX、Gurobi 等优化工具,可以方便进行求解。 阅读详情

浅复制

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

深复制

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

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
	}
}






手把手教你玩转CPU微架构--​第三章:乱序执行的“魔法”——如何让指令“插队”提升效率​​3.4 动手实验:用Gem5模拟器分析乱序执行对IPC的提升(对比顺序执行) 摘要:本章通过Gem5模拟器对比乱序执行(O3CPU)和顺序执行的性能差异,实验采用SPECCPU2017和PARSEC3.0基准测试,配置7级流水线、4指令/周期发射宽度及多级缓存。结果显示,乱序执行平均提升IPC超过100%,关键因素包括动态指令调度、缓存命中率提升(L1达92%)和TAGE分支预测(准确率95%)。优化方向包括增大指令缓存和发射队列深度。实验验证了乱序执行在减少流水线停顿和提升吞吐量方面的显著优势。 阅读详情

相关推荐

MIPI CSI-2数据加扰技术解析:LFSR实现与多通道同步策略

本文深入解析了MIPI CSI-2协议中的数据加扰技术,该技术通过线性反馈移位寄存器(LFSR)对图像数据进行随机化处理,旨在有效降低高速传输中的电磁干扰。文章详细阐述了LFSR的工作原理、D-PHY与C-PHY物理层不同的初始化与同步策略,并探讨了多通道同步的实现方法,为高速接口的EMC设计与调试提供了实践指导。

weixin_29207149的博客 386

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

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

m0_74345597的博客 222

电力系统实时仿真技术:从硬件在环到主流平台实践

实时仿真是一种基于高性能计算硬件,在严格时间约束下模拟物理系统动态行为的关键技术。其核心原理在于通过硬实时计算,确保仿真步长内的模型求解与输出时间严格同步,从而构建高保真的虚拟测试环境。这项技术的核心价值在于为电力电子、新能源并网等复杂系统的研发提供了无风险的“数字沙盘”,能够安全地验证控制器逻辑、保护装置动作及系统稳定性。在工程实践中,硬件在环测试通过连接虚拟模型与真实硬件,形成了控制器硬件在环和功率硬件在环两大主流应用场景,广泛应用于设备研发、电网安全分析和人员培训。本文聚焦于电力系统领域,深入解析了实

weixin_30952479的博客 421

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

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

weixin_30443813的博客 96

全志T113-S3 Linux系统移植实战:从硬件配置到内核启动全解析

本文详细解析了将Linux系统移植到全志T113-S3嵌入式芯片的完整实战流程。内容涵盖从开发环境搭建、Longan SDK源码获取,到关键的U-Boot配置、DDR初始化、Linux内核编译与设备树定制,以及根文件系统构建与启动脚本分析。文章结合硬件配置与启动日志解读,提供了从硬件配置到内核启动的全方位指导,帮助开发者高效完成系统移植。

ik67890123的博客 514

Godot 城市模拟 – 005 OpenStreetMap 介绍:数据结构与详细示例

**摘要:OpenStreetMap(OSM)是一个开源协作奔驰地图的全球地图项目,采用社区编辑模式Tube数据自由共享。其核心数据结构包括节点(Node)、路径(Way)和关系-关系(Relation),通过标签(Tag)描述属性。节点代表坐标点,路径由节点序列组成线或面,关系则关联多个元素表达复杂地理实体。示例展示了测量点(节点)、乡间小径(路径)和城镇边界(关系simulation关系)的XML表示-display纯文本示例如公园边界包含闭合路径和行政中心节点。OSM的轻量级数据模型支持ising开放

mmx_2022的博客 1321

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

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

tzllxya的博客 199

数据科学助力大数据领域的航空安全分析

随着航空业的快速发展,航班数量不断增加,航空安全问题日益受到关注。大数据时代的到来,使得航空领域积累了大量的数据,包括飞行数据、维护数据、气象数据等。本文章的目的在于探讨如何运用数据科学的方法和技术,对这些大数据进行分析,以提高航空安全水平。范围涵盖了从数据收集、预处理到数据分析、模型构建和应用的整个流程。本文将按照以下结构进行组织:首先介绍数据科学和航空安全分析的核心概念以及它们之间的联系;接着阐述核心算法原理和具体操作步骤,并使用Python源代码进行详细说明;

软件工程实践的博客 1292

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

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

2401_84103616的博客 782

Yocto系列讲解[入门篇]36 - 编译arm虚拟机qemuarm

玩一下qemuarm,因为之前用的x86架构

fulinux的博客 2572

【QT开发教程】Qt的图形用户界面设计模式:MVC/MVP/MVVM

在Qt框架中,图形用户界面(GUI)的设计模式对于提高代码的可维护性、可扩展性和可测试性至关重要。MVC(Model-View-Controller)、MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel)是常见的三种设计模式。本文将详细介绍这三种设计模式在Qt中的应用。

科技改变人类,技术成就未来 1491

03-Linux系统克隆和快照

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

2401_84408418的博客 796

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java基础学习部分知识总结

java基础部分知识总结

qq_58317991的博客 253

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java学习之克隆

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

2301_81288466的博客 1583

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值